繼承的幾種方式

1肋联、原型鏈

如何實現(xiàn)
function SuperType() {
    this.color = 'green';
}
SuperType.prototype.getSuperColor = function () {
    return this.color;
}
function SubType() {
    this.SubColor = 'red'
}
SubType.prototype = new SuperType();
SubType.prototype.getSubColor = function () {
    return this.SubColor;
}
var instance = new SubType();
alert(instance.getSuperColor());   // 'green'
存在的問題

最主要的問題就是包含引用類型值的原型谬擦。

function Super() {
    this.colors = ['red', 'green'];
}
function Sub() {

}
Sub.prototype = new Super();
var instance1 = new Sub();
var instance2 = new Sub();
instance1.colors.push('blue');
console.log(instance1.colors);   // ["red", "green", "blue"]
console.log(instance2.colors);   // ["red", "green", "blue"]
總結(jié)

很少單獨使用原型鏈來實現(xiàn)繼承颗品。

2、借用構(gòu)造函數(shù)(偽造對象侧巨、經(jīng)典繼承)

如何實現(xiàn)
# 基本實現(xiàn)繼承
function Super() {
    this.colors = ['red', 'green'];
}
function Sub() {
     Super.call(this);
}
var instance1 = new Sub();
var instance2 = new Sub();
instance1.colors.push('blue');
console.log(instance1.colors);   // ["red", "green", "blue"]
console.log(instance2.colors);   // ["red", "green"]

# 子類型構(gòu)造函數(shù)中向超類型構(gòu)造函數(shù)中傳遞參數(shù)
function Super(name) {
    this.name = name;
}
function Sub() {
    Super.call(this, 'tom');
    this.age = 24;
}
var instance = new Sub();
console.log(instance.name);   // tom
console.log(instance.age);   // 24
存在的問題

方法也必須在超類型構(gòu)造函數(shù)中定義,在超類型的原型上定義的方法不能成功繼承給子類型的實例鞭达。

function Super() {
    this.fruit = 'orange';
}
Super.prototype.getSuperFruit = function () {
    return this.fruit;
}
function Sub() {
    Super.call(this);
}
var instance = new Sub();
alert(instance.getSuperFruit());   //  instance.getSuperFruit is not a function
總結(jié)

很少單獨使用借用構(gòu)造函數(shù)實現(xiàn)繼承司忱。

3、組合繼承 (偽經(jīng)典繼承)

如何實現(xiàn)
function Super(name) {
    this.name = name;
    this.colors = ['red', 'green'];
}
Super.prototype.getSuperName = function () {
    return this.name;
}
function Sub(name) {
    Super.call(this, name);
    this.age = 24;
}
Sub.prototype = new Super();
Sub.prototype.constructor = Sub;
var instance = new Sub('tom');
console.log(instance.name);   // tom
console.log(instance.getSuperName());   // tom
存在的問題

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

總結(jié)

組合繼承是javascript中最常用的繼承模式。

4 、原型式繼承梳玫。

如何實現(xiàn)
# 基本的實現(xiàn)方式
function object(o) {
    function F() {

    }
    F.prototype = o;
    return new F();
}
var person = {
    name: 'tom',
    fruit: ['orange', 'banana']
};
var anotherPerson = object(person);
anotherPerson.name = 'jack';
anotherPerson.fruit.push('apple');
var yetAnotherPerson = object(person);
yetAnotherPerson.name = 'alice';
yetAnotherPerson.fruit.push('grape');
console.log(yetAnotherPerson.fruit);   // ["orange", "banana", "apple", "grape"]

# ECMAScript 5 封裝的 Object.create()方法
var person = {
    name: 'tom',
    fruit: ['orange', 'banana']
};
var anotherPerson = Object.create(person);
anotherPerson.name = 'jack';
anotherPerson.fruit.push('apple');
var yetAnotherPerson = Object.create(person);
yetAnotherPerson.name = 'alice';
yetAnotherPerson.fruit.push('grape');
console.log(yetAnotherPerson.fruit);   // ["orange", "banana", "apple", "grape"]
存在的問題

包含引用類型值得屬性始終都會共享相應(yīng)的值爹梁。

總結(jié)

在沒有必要興師動眾地創(chuàng)建構(gòu)造函數(shù),而只想讓一個對象與另一個對象保持類似的情況下提澎,原型式繼承是完全可以勝任的姚垃。

5、寄生式繼承

如何實現(xiàn)
function object(o){
    function F() {

    }
    F.prototype = o;
    return new F();
}
function createAnother(o) {
    var clone = object(o);
    clone.sayHi = function () {
        alert('hi~');
    }
    return clone;
}
var person = {
    name: 'tom',
    colors: ['red', 'green', 'blue']
};
var anotherPerson = createAnother(person);
anotherPerson.sayHi();   // 'hi~'
總結(jié)

在主要考慮對象而不是自定義類型和構(gòu)造函數(shù)的情況下盼忌,寄生式繼承也是一種有用的模式积糯。

6、寄生組合式繼承

如何實現(xiàn)
function SuperType(name) {
    this.name = name;
    this.colors = ['red', 'green', 'blue'];
}
SuperType.prototype.sayHi = function () {
    alert('hi~' + this.name);
};
function SubType(name, age) {
    SuperType.call(this, name);
    this.age = age;
}
function inheritPrototype(subType, superType) {
     var prototype = Object.create(superType.prototype);
     prototype.constructor = subType;
     subType.prototype = prototype;
}
inheritPrototype(SubType, SuperType);
var another = new SubType('jack', 24);
another.sayHi();   // 'hi jack'
console.log(another);
總結(jié)

寄生組合式繼承是引用類型最理想的繼承范式谦纱。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末看成,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子跨嘉,更是在濱河造成了極大的恐慌川慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件偿荷,死亡現(xiàn)場離奇詭異窘游,居然都是意外死亡,警方通過查閱死者的電腦和手機跳纳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門忍饰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人寺庄,你說我怎么就攤上這事艾蓝。” “怎么了斗塘?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵赢织,是天一觀的道長。 經(jīng)常有香客問我馍盟,道長于置,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任贞岭,我火速辦了婚禮八毯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瞄桨。我一直安慰自己话速,他們只是感情好,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布芯侥。 她就那樣靜靜地躺著泊交,像睡著了一般乳讥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上廓俭,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天云石,我揣著相機與錄音,去河邊找鬼白指。 笑死留晚,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的告嘲。 我是一名探鬼主播错维,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼橄唬!你這毒婦竟也來了赋焕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤仰楚,失蹤者是張志新(化名)和其女友劉穎隆判,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體僧界,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡侨嘀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了捂襟。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咬腕。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖葬荷,靈堂內(nèi)的尸體忽然破棺而出涨共,到底是詐尸還是另有隱情,我是刑警寧澤宠漩,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布举反,位于F島的核電站,受9級特大地震影響扒吁,放射性物質(zhì)發(fā)生泄漏火鼻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一雕崩、第九天 我趴在偏房一處隱蔽的房頂上張望魁索。 院中可真熱鬧,春花似錦晨逝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春趁窃,著一層夾襖步出監(jiān)牢的瞬間牧挣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工醒陆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瀑构,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓刨摩,卻偏偏與公主長得像寺晌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子澡刹,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容