一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

JS繼承之借用構(gòu)造函數(shù)繼承和組合繼承

 hh3755 2017-02-24

根據(jù)少一點套路,多一點真誠這個原則,繼續(xù)學習。


借用構(gòu)造函數(shù)繼承

在解決原型中包含引用類型值所帶來問題的過程中,開發(fā)人員開始使用一種叫做借用構(gòu)造函數(shù)
(constructor stealing)的技術(shù)(有時候也叫做偽造對象或經(jīng)典繼承)。這種技術(shù)的基本思想相當簡單,即
在子類型構(gòu)造函數(shù)的內(nèi)部調(diào)用超類型構(gòu)造函數(shù)。

基本模式

1
2
3
4
5
6
7
8
9
10
11
12
function SuperType(){
  this.colors = ["red", "blue", "green"];
}
function SubType(){
   //繼承了SuperType
  SuperType.call(this);
}
var instance1 = new SubType();
instance1.colors.push("black");
alert(instance1.colors); //"red,blue,green,black"
var instance2 = new SubType();
alert(instance2.colors); //"red,blue,green"

基本思想

借用構(gòu)造函數(shù)的基本思想就是利用call或者apply把父類中通過this指定的屬性和方法復制(借用)到子類創(chuàng)建的實例中。因為this對象是在運行時基于函數(shù)的執(zhí)行環(huán)境綁定的。也就是說,在全局中,this等于window,而當函數(shù)被作為某個對象的方法調(diào)用時,this等于那個對象。call 、apply方法可以用來代替另一個對象調(diào)用一個方法。call、apply 方法可將一個函數(shù)的對象上下文從初始的上下文改變?yōu)橛?thisObj 指定的新對象。   

所以,這個借用構(gòu)造函數(shù)就是,new對象的時候(注意,new操作符與直接調(diào)用是不同的,以函數(shù)的方式直接調(diào)用的時候,this指向window,new創(chuàng)建的時候,this指向創(chuàng)建的這個實例),創(chuàng)建了一個新的實例對象,并且執(zhí)行SubType里面的代碼,而SubType里面用call調(diào)用了SuperTyep,也就是說把this指向改成了指向新的實例,所以就會把SuperType里面的this相關(guān)屬性和方法賦值到新的實例上,而不是賦值到SupType上面。所有實例中就擁有了父類定義的這些this的屬性和方法。

優(yōu)勢

相對于原型鏈而言,借用構(gòu)造函數(shù)有一個很大的優(yōu)勢,即可以在子類型構(gòu)造函數(shù)中向超類型構(gòu)造函數(shù)傳遞參數(shù)。因為屬性是綁定到this上面的,所以調(diào)用的時候才賦到相應(yīng)的實例中,各個實例的值就不會互相影響了。

例如:

復制代碼
function SuperType(name){
this.name = name;
}
function SubType(){
//繼承了SuperType,同時還傳遞了參數(shù)
SuperType.call(this, "Nicholas");
//實例屬性
this.age = 29;
}
var instance = new SubType();
alert(instance.name); //"Nicholas";
alert(instance.age); //29
復制代碼

劣勢

如果僅僅是借用構(gòu)造函數(shù),那么也將無法避免構(gòu)造函數(shù)模式存在的問題——方法都在構(gòu)造函數(shù)中定義,因此函數(shù)復用就無從談起了。而且,在超類型的原型中定義的方法,對子類型而言也是不可見的,結(jié)果所有類型都只能使用構(gòu)造函數(shù)模式??紤]到這些問題,借用構(gòu)造函數(shù)的技術(shù)也是很少單獨使用的。

組合繼承

組合繼承(combination inheritance),有時候也叫做偽經(jīng)典繼承。是將原型鏈和借用構(gòu)造函數(shù)的技術(shù)組合到一塊,從而發(fā)揮二者之長的一種繼承模式。

基本思想

思路是使用原型鏈實現(xiàn)對原型屬性和方法的繼承,而通過借用構(gòu)造函數(shù)來實現(xiàn)對實例屬性的繼承。這樣,既通過在原型上定義方法實現(xiàn)了函數(shù)復用,又能夠保證每個實例都有它自己的屬性。

基本模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function SuperType(name){
  this.name = name;
  this.colors = ["red", "blue", "green"];
}
SuperType.prototype.sayName = function(){
   alert(this.name);
};
function SubType(name, age){
//繼承屬性
  SuperType.call(this, name);
  this.age = age;
}
//繼承方法
SubType.prototype = new SuperType();
SubType.prototype.constructor = SubType;
SubType.prototype.sayAge = function(){
alert(this.age);
};
var instance1 = new SubType("Nicholas", 29);
instance1.colors.push("black");
alert(instance1.colors); //"red,blue,green,black"
instance1.sayName(); //"Nicholas";
instance1.sayAge(); //29
var instance2 = new SubType("Greg", 27);
alert(instance2.colors); //"red,blue,green"
instance2.sayName(); //"Greg";
instance2.sayAge(); //27

優(yōu)勢

組合繼承避免了原型鏈和借用構(gòu)造函數(shù)的缺陷,融合了它們的優(yōu)點,成為JavaScript 中最常用的繼承模式。

劣勢

組合繼承最大的問題就是無論什么情況下,都會調(diào)用兩次超類型構(gòu)造函數(shù):一次是在創(chuàng)建子類型原型的時候,另一次是在子類型構(gòu)造函數(shù)內(nèi)部。雖然子類型最終會包含超類型對象的全部實例屬性,但我們不得不在調(diào)用子類型構(gòu)造函數(shù)時重寫這些屬性。

  

 To be continued...

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    又大又紧又硬又湿又爽又猛| 国产一区二区三区成人精品| 91精品视频免费播放| 国产午夜福利在线观看精品| 久久人妻人人澡人人妻| 内射精品欧美一区二区三区久久久| 2019年国产最新视频| 国产一区二区精品丝袜| 午夜久久久精品国产精品| 午夜国产福利在线播放| 日韩欧美一区二区不卡看片| 99免费人成看国产片| 久久精品国产亚洲av久按摩| 亚洲欧美日韩国产成人| 久草视频在线视频在线观看| 中文字幕久热精品视频在线| 视频一区二区黄色线观看| 亚洲综合伊人五月天中文| 成人国产激情在线视频| 日本欧美一区二区三区在线播| 亚洲国产婷婷六月丁香| 日本精品理论在线观看| 国产精品欧美一区二区三区不卡| 丁香六月婷婷基地伊人| 青青操视频在线观看国产| 色婷婷视频国产一区视频| 激情亚洲一区国产精品久久| 好吊视频有精品永久免费| 日韩在线精品视频观看| 色婷婷久久五月中文字幕| 亚洲丁香婷婷久久一区| 日韩欧美亚洲综合在线| 字幕日本欧美一区二区| 黄色污污在线免费观看| 日韩女优精品一区二区三区| 亚洲内射人妻一区二区| 国产日韩欧美专区一区| 精品人妻一区二区四区| 国产水滴盗摄一区二区| 欧美一级内射一色桃子| 国产农村妇女成人精品|