閒話少敘,繼續講單身狗的故事。
function
animal
()function
dog(name)
我們知道,單身狗是一種動物,那麼工廠怎麼來表示這種繼承關係呢?
function
animal
()function
dog(name)
var dog = new dog('單身狗');
console.log(dog.name, dog.type); // 單身狗 動物
前提知識:
原型鏈繼承方式最終表達為:
var dog = new dog();
// 獲得父類和爺爺類方法如下
dog.__proto__.__proto__.__proto__;
2.1 那麼__proto__
這個是怎麼來的呢?// 例項的__proto__是引用建構函式的prototype
dog.__proto__ === dog.prototype; // true
按照上面**的邏輯父類應該怎麼繼承就變成了這樣:
dog.prototype.__proto__ === animal.prototype; // true
那麼怎樣達到上面**的效果呢?
dog.prototype = new animal();
這種方式有什麼問題?
每個prototype都有乙個constructor,指向構造方法本身:
dog.prototype.constructor === dog; //
true
執行以上**後就變成了:
dog.prototype.constructor === animal; //
true
這樣就破壞了構造方法的基本結構。
為什麼會變成這樣?
實際上呼叫方法內****執行的:
1.先在dog.prototype
上查詢constructor
屬性,實際上沒找到;
2.再在dog.prototype
的原型鏈查詢上一級原型是否含有這個屬性dog.prototype.__proto__.constructor
;
3.發現有乙個叫做constructor
的屬性,然後返回這個屬性。
怎麼解決?
// 加一句
dog.prototype.constructor = dog;
完整版:
dog.prototype = new animal();
dog.prototype.constructor = dog;
var dog = new dog();
完美!
2.2 思考另外一種方法
// 是否可以這樣實現子類繼承父類?
dog.prototype = animal.prototype;
dog.prototype.constructor = dog;
var dog = new dog();
測試:
animal.prototype.constructor === dog; // true
問題:
改掉了父類的構造方法。
2.3 終極繼承**!
var f = function
(){};
f.prototype = animal.prototype;
dog.prototype = new f();
dog.prototype.constructor = dog;
優點:
節能環保
new dog()
被執行時乾的活:
1.dog
方法內建立乙個物件,this
指向這個物件;
2.this.__proto__ = dog.prototype
;
3. 執行dog
方法內的邏輯;
4. 方法最後一定返回乙個物件。分以下幾種情況
如果沒有return
,則返回this
。如果有
return
,且return
返回的是乙個js的原始資料,方法返回this
。反之,方法返回return
關鍵字後面的物件。
var self;
function
foo()
foo.prototype.getname = function
() var f = new foo();
console.log(f === self);
單身狗和共享單車的約會
1個揹包,3只單身狗,7小時騎行,80公里,自己選的路跪著也要走完 前言 與兩個大兄弟的約會 周五下班的路上,騎著摩拜單車飛奔在馬路上。聽到後面的大兄弟說週六週末幹嘛去,於是另外乙個大兄弟說要不騎三環,三環太沒有挑戰了吧,繞著城市騎行有什麼意思,除了跟在小汽車後面吃灰,還累成狗,有什麼意義,於是我大...
單身狗和共享單車的約會
1個揹包,3只單身狗,7小時騎行,80公里,自己選的路跪著也要走完 前言 與兩個大兄弟的約會 周五下班的路上,騎著摩拜單車飛奔在馬路上。聽到後面的大兄弟說週六週末幹嘛去,於是另外乙個大兄弟說要不騎三環,三環太沒有挑戰了吧,繞著城市騎行有什麼意思,除了跟在小汽車後面吃灰,還累成狗,有什麼意義,於是我大...
苦逼的單身狗
題目描述 雙11又到了,小z依然只是乙隻單身狗,對此他是如此的苦惱又無可奈何。為了在這一天脫單小z決定向女神表白,但性格靦腆的小z決定隱晦一點,擷取一段包含 l o v e 的英文。順序不限 小z想起之前小d送給他一本英文書,決定在這裡面擷取一段話,小z發現有好多種方案來擷取這段話。你能知道小z能有...