????這幾天寫Blog,加深了之前的一個點,就是對象實例的原型其實是undefined
。
????如下例子:
function Test(name) {
this.name = name
}
let test1 = new Test('yourName')
Test.prototype // {constructor:function Test(){}}
Test.constructor // function Function() {}
test1.constructor // function Test() {}
test1.prototype // undefined
????眾所周知,實例調用屬性和方法,會沿著原型鏈向上查找,直到找到最頂層的對象,那最頂層的對象是啥呢?看下面的例子:
Object.prototype // Object {}
Object.prototype._proto_ // undefined
????所以,個人理解為最頂層的對象就是undefined
。
????好,接下來回到最初的那個問題:對象實例的原型為什么是undefined?
????原因就在于:
1)只有函數才有prototype
屬性。
2)所有對象都有_proto_
屬性,指向原型對象。
3)所有函數的_proto_
都默認指向function Function() {}
的prototype
。
??????所有對象的_proto_
都默認指向function Object() {}
的prototype
。
也可以這樣認為,函數prototype
存在的意義就是在于當通過new操作符生成實例的時候,實例能夠繼承函數prototype
指向的原型對象。
????在創建對象的時候會自動創建一個_proto_
屬性,指向它構造函數的prototype
,當訪問這個對象的屬性的時候會順帶訪問_proto_
中對應的屬性,也就是構造函數prototype
,這樣實現了繼承。只有創建函數的時候才會創建一個prototype
屬性,目的就是為了完成上面的繼承方式。
????以上個人理解,如有錯誤歡迎指正。