javascript
一张图看透JavaScript原型关系:__proto__(对象原型)和prototype(函数原型)
問:函數豈不是擁有兩個原型?
答:是的,函數有兩個原型proto和prototype。
因為函數是對象,而對象就有原型,其原型就是proto。函數是Function的實例,所以此原型就是Function.prototype。
而函數的prototype,不是給自己用的,而是給自己實例用的。
問:到底是構造函數有原型,還是實例有原型?
答:關鍵是這個“有”字怎么解釋。說白了,就是擁有權和使用權的區分。平常我們說話時,并不仔細區分二者。
就像我們經常會說,“你的公司在哪里?”,但我們都知道,公司并不是你的,是屬于董事會的,你只是在那上班罷了。
又比如,你有輛跑車,但你從來不開它,卻給你的親朋好友開。你有擁有權,但沒使用權。相反,你的好友雖沒有擁有權,但有使用權。
從一般語義上來說,構造函數擁有原型,放在自身prototype上,但不是給自身用的,而是給它的實例用的。
從JS的語義上來說,實例對象擁有原型,其內部屬性[[prototype]](即proto指向)指向構造器的prototype。
另外一點,擁有權是獨占的,而使用權是共享的。
因此某一個構造函數的不同實例的原型是同一個。
問:原型鏈的終點是什么?
答:Object.prototype。它是個對象,它的原型是null。
問:函數都是Function的實例,而Function也是函數,它是誰的實例?
答:它是自身的實例。所以它的proto與自身的prototype是同一個東西。而且是個函數,此函數不再有prototype,但是作為對象,它的proto是Object.prototype。這是系統內置好的。
問:Object.proto和Object.prototype是什么關系?
答:后者是前者的原型。因為Object是函數,是Function的實例,因此Object.proto就是Function.prototype,所以后者是前者的原型。
請尊重原創,原文鏈接:http://www.qdfuns.com/notes.php?mod=view&u=17398&id=6962d01d88c6b73ea606662fd397b6f6
總結
以上是生活随笔為你收集整理的一张图看透JavaScript原型关系:__proto__(对象原型)和prototype(函数原型)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端面试中常见的算法问题
- 下一篇: 07--MySQL自学教程:DQL(Da