原型鏈學習(一)

2022-07-13 08:51:11 字數 3284 閱讀 2985

//所有的物件都是通過new建立出來的

//所有的函式也是物件,所以函式中也可以有屬性,

// 比如array.isarray,number.isnan()

//所有物件都是引用型別

function

test() 

}console.log(new

test())//建構函式是object

function

test1() 

console.log(new

test1())//建構函式是test1

console.log(typeof

array)//function

console.log(typeof

string)//function

console.log(typeof

function)//function

console.log(typeof

number)//function

console.log(typeof

object)//function

console.log(typeof

boolean)//function

console.log(typeof

null)//object

console.log(typeof

test1)//function

//原型:所有函式都有乙個屬性:prototype,稱之為函式原型

// 預設情況下,prototype是乙個普通object物件,new 乙個物件之後系統預設加上的

//預設情況下,prototype中有乙個屬性,constructor,他也是乙個物件,指向建構函式本身

//隱式原型__proto__,所有物件都有隱式原型,

//隱式原型指向該物件的建構函式的prototype

//     特殊點

//         1.function的隱式原型指向自身的prototype,即function.prototype===function.__proto__

//      2.object的prototype的__proto__指向null

varobj=new

test1();

console.log(obj.__proto__==test1.prototype)//test1返回的是函式,true

varobj1=new

test();

console.log(obj1.__proto__==test.prototype)//test1返回的是乙個物件,false

console.log(obj1.__proto__==object.prototype)//test1返回的是乙個物件,true

//    面試題

function

a() {}

vara=new

a();

varb=new

a();

a.abc=123;

b.__proto__.bcd=456;

console.log(a.abc,b.abc)//123  undefined

console.log(a.__proto__.bcd,b.__proto__.bcd) // 456 456

//改乙個物件的__proto__等同於修改該物件的建構函式的prototype,使用的是同一塊位址空間

console.log(a.prototype.bcd)//456

//當訪問的是乙個物件的成員時,

// 1.如果有,則直接使用

// 2.如果該物件上面沒有,就去隱式原型上面找(__proto__)

//3.如果還是沒找到,就去原型鏈上一直找

//原型鏈上程式設計(猴子補丁):在函式原型中加入成員,以增強物件的功能,但是會導致原型鏈汙染,使用需謹慎

string.prototype.camel=function () ).replace(/\s/

g,"")

}//面試題

varf=function () {}

object.prototype.a=function () {}

function.prototype.b=function () {}

varf=new

f();

console.log(f.a,f.b,f.a,f.b)//fn undefined fn fn

//面試題

function

a() {}

function

b(a) 

function

c(a) 

}a.prototype.a=1

b.prototype.a=1

c.prototype.a=1

console.log(new

a().a)//1

console.log(new

b().a)//undefined

console.log(new

c().a)//2

//原型鏈最難面試

function

user() {}

user.prototype.sayhello=function () {}

varu1=new

user();

varu2=new

user()

console.log(u1.sayhello===u2.sayhello)//true

console.log(user.prototype.constructor)//user

console.log(user.prototype===function.prototype)//false

console.log(user.__proto__===function.prototype)//true

console.log(user.__proto__===function.__proto__)//true

console.log(u1.__proto__===u2.__proto__)//true

console.log(u1.__proto__===user.__proto__)//false

console.log(function.__proto__===object.__proto__)//true

console.log(function.prototype.__proto__===object.prototype.__proto__)//false

console.log(function.prototype.__proto__==object.prototype)//true

(完)

原型與原型鏈深度學習

1.函式物件的 prototype 屬性 我們建立的每乙個函式都有乙個 prototype 屬性,這個屬性是乙個指標,指向乙個物件。該函式例項化的所有物件的 proto 的屬性指向這個物件,它是該函式所有例項化物件的原型。建構函式 2.constructor屬性 當函式建立,prototype 屬性...

原型鏈學習總結

學習於 定義物件a 和b a.proto b。1 當a.ss時在自身物件找不到該屬性則會往繼承的原型上去找,也就是輸出b.ss。a 和b a.proto b console.log a.ss 2 2 修改原型上的值,即b.ss 3 則a.ss也等於3。a 和b a.proto b b.ss 3 co...

原型 原型鏈

var animal function var dog function animal.price 2000 dog.prototype animal var tidy new dog console.log dog.price 為什麼輸出 undefined console.log tidy.pr...