*如下全文用[[Prototype]]
表明對象真正的原型鏈函數
prototype
與__proto__
的區別__proto__
是真正的原型鏈,也就是[[Prototype]]
,使用原型鏈時,查找對象的屬性是經過__proto__
來查找,而不是prototype
varFoo=function(){}; Foo.__proto__.a ='b'; Foo.prototype.a ='a'; alert(Foo.a);//b
prototype
只是用於構建用new
關鍵字建立的對象,將構造器函數的prototype
的引用指向於構建的對象的__proto__
varFoo=function(){}; var test =newFoo(); alert(test.__proto__ ===Foo.prototype);//true
prototype
與__proto__
是不相同的,其protoype
會被構建的對象的[[Prototype]]
引用,其[[Prototype]]
是Function
對象的[[Prototype]]
,Function
對象的prototype
與__proto__
是相同的
varFoo=function(){}; alert(Foo.prototype ===Foo.__proto__);//false alert(Function.__proto__ ===Foo.__proto__);//true alert(Function.__proto__ ===Function.prototype);//true
constructor
是什麼prototype
的constructor
也就等於這個構造器函數自己,一個構造器函數的__proto__
的constructor
,也就是Function
的consturctor
就等於Function
自己
varFoo=function(){}; var test =newFoo(); alert(Foo.constructor ===Function);//true alert(Foo.prototype.constructor === test.constructor);//true alert(Foo=== test.constructor);//true alert(Foo.constructor ===Foo.prototype.constructor);// false
Foo |_ protoype |_ consturctor === Foo |_ __proto__ === Object.prototype |_ constuctor === Object |_ __proto__ === null |_ __proto__ |_ __proto__ === Function.protoype |_ constuctor === Function |_ __proto__ === Object.protoype |_ consturctor === Object |_ __proto__ === null
test |_ __proto__ === Foo.protoype |_ constructor === Foo |_ __proto__ === Object.protoype |_ constuctor === Object |_ __proto__ === null
protoype
屬性,Object.__proto__ === Function.__proto__
,Object.__proto__.contructor === Object