開局先上一張圖、分清楚函數與對象:
獲得結論:對象都有_proto_這個屬性,可是隻有函數對象纔有prototype這個屬性。函數
得出上面結論後咱們再上一張圖、咱們對話題研究都是基於這張圖:spa
根據上圖,本身些代碼論證一下得出一下結論: const Foo =function(){}; const Foo_prototype = Foo.prototype; const f1 = new Foo(); Foo.prototype == Foo.prototype //true Foo_prototype.constructor == Foo //true //1得出結論,Foo是一個函數對象,Foo的原型Foo_prototype的構造函數就是Foo自己 f1.__proto__ == Foo.prototype // true //2得出結論,foo的實例指向f1的原型鏈上一個節點也就是Foo的原型 Foo_prototype.__proto__ == Object;//true //3得出結論,Foo原型指向Foo的上一個原型節點 const Object_prototype = Object.prototype; Object_prototype.__proto__ == null//true //4得出結論,Object的原型鏈上一個節點是null,這也就是萬物皆對象,null中生對象 const Function_prototype = Function.prototype; Object.__proto__ == Function_prototype//true //5得出結論,原生對象指向Function的原型, Function.__proto__ == Function_prototype;//true //6得出結論,Function的原型鏈的上一個節點是Function自己 Foo.__proto__ == Function_prototype//true //7得出結論,Foo的原型鏈上一個節點指向Function
**通過上述代碼驗證得出以下結論:
1.全部對象都有_proto_這個屬性。
2.全部的原型對象都有constructor屬性,該屬性對應建立全部指向該原型的實例的構造函數。
3.原型鏈的頂端是null。**prototype
**4.對象自己的prototype和_proto_毫無關係,_proto_指向原型鏈上一個節點的原型。
5.Function的原型鏈的上一個節點是Function自己(這個很奇怪哎)。**
OK,拋出一個問題:code
//一般狀況下,爲了只繼承父函數的原型而不繼承其餘靜態方法每每這樣定義 b = function(){}; c = function(){}; b.prototype.say = 1; c.prototype.say = 2; function extend(father,son){ var def = function(){}; def.prototype = father.prototype; son.prototype = new def(); } extend(b,c)
問題:
1.繼承的時候能夠直接使用son.prototype = father.prototype 嗎?
2.爲何要新建一個def函數,而後son繼承def的原型來繼承呢?
3.經過1方法和2方法生成的son是同樣的嗎?對象