對原型鏈和原型以及構造函數的驗證

開局先上一張圖、分清楚函數與對象:
圖片描述
獲得結論:對象都有_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是同樣的嗎?對象

相關文章
相關標籤/搜索