????這幾天寫B(tài)log矫俺,加深了之前的一個(gè)點(diǎn)遂鹊,就是對象實(shí)例的原型其實(shí)是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
????眾所周知钧椰,實(shí)例調(diào)用屬性和方法蛛壳,會(huì)沿著原型鏈向上查找杏瞻,直到找到最頂層的對象,那最頂層的對象是啥呢衙荐?看下面的例子:
Object.prototype // Object {}
Object.prototype._proto_ // undefined
????所以捞挥,個(gè)人理解為最頂層的對象就是undefined
。
????好忧吟,接下來回到最初的那個(gè)問題:對象實(shí)例的原型為什么是undefined?
????原因就在于:
1)只有函數(shù)才有prototype
屬性砌函。
2)所有對象都有_proto_
屬性,指向原型對象溜族。
3)所有函數(shù)的_proto_
都默認(rèn)指向function Function() {}
的prototype
讹俊。
??????所有對象的_proto_
都默認(rèn)指向function Object() {}
的prototype
。
也可以這樣認(rèn)為煌抒,函數(shù)prototype
存在的意義就是在于當(dāng)通過new操作符生成實(shí)例的時(shí)候仍劈,實(shí)例能夠繼承函數(shù)prototype
指向的原型對象。
????在創(chuàng)建對象的時(shí)候會(huì)自動(dòng)創(chuàng)建一個(gè)_proto_
屬性寡壮,指向它構(gòu)造函數(shù)的prototype
贩疙,當(dāng)訪問這個(gè)對象的屬性的時(shí)候會(huì)順帶訪問_proto_
中對應(yīng)的屬性,也就是構(gòu)造函數(shù)prototype
诬像,這樣實(shí)現(xiàn)了繼承屋群。只有創(chuàng)建函數(shù)的時(shí)候才會(huì)創(chuàng)建一個(gè)prototype
屬性,目的就是為了完成上面的繼承方式坏挠。
????以上個(gè)人理解芍躏,如有錯(cuò)誤歡迎指正。