掌握js的原型鏈與繼承讹开,看這篇就夠了

最經(jīng)典的原型鏈?zhǔn)疽鈭D

一:繼承的幾種方式

繼承需要一個父類盅视,在這里我們先把他定義出來:

// 定義一個動物類
function Animal (name) {
    // 屬性
    this.name = name || 'Animal';
    this.sleep = function(){
        console.log(this.name + '正在睡覺!');
    }
}

// 原型方法
Animal.prototype.eat = function(food) {
    console.log(this.name + '正在吃:' + food);
};

1旦万,原型鏈繼承

原型鏈繼承的核心是闹击,將父類的實(shí)例作為子類的原型

function Cat(){
    this.name = 'cat'
}

Cat.prototype = new Animal();
Cat.prototype.name = 'cat';//將Cat的原型名字設(shè)為Cat,這句話必須放在new之后
Cat.prototype.constructor = Cat;//將Cat的原型鏈constructer指向Cat成艘,防止出現(xiàn)混亂

// Test Code
var cat = new Cat();

console.log(cat.name);// cat
console.log(cat.eat('fish'));//cat正在吃fish 
console.log(cat.sleep());//cat正在睡覺
console.log(cat instanceof Animal); //true 
console.log(cat instanceof Cat); //true

特點(diǎn)

  • 非常純粹的繼承關(guān)系赏半,實(shí)例是子類的實(shí)例,也是父類的實(shí)例
  • 父類新增原型方法/原型屬性淆两,子類都能訪問到
  • 簡單断箫,易于實(shí)現(xiàn)

缺點(diǎn)

  • 可以在Cat構(gòu)造函數(shù)中,為Cat實(shí)例增加實(shí)例屬性秋冰。如果要新增原型屬性和方法仲义,則必須放在new Animal()這樣的語句之后執(zhí)行。
  • 無法實(shí)現(xiàn)多繼承
  • 來自原型對象的"引用屬性":(如數(shù)組或者對象的話)剑勾,是所有實(shí)例共享的
  • 創(chuàng)建子類實(shí)例時埃撵,無法向父類構(gòu)造函數(shù)傳參

對于第四點(diǎn)舉個例子:

function Parents(name){ this.name=name; }
Children.prototype=new Parents("Hello");

那么此時,Children 類就擁有了 name=“Hello” 屬性虽另,而 Children 類的實(shí)例對象 c1暂刘、c2、c3 等等只能被迫接受這個 name 屬性捂刺。Children 是 "Hello" 的擁有者而 c1谣拣、 c2、c3不是叠萍!

2芝发,構(gòu)造繼承

function Cat(name){
    Animal.call(this);
    this.name = name || 'Tom';
}

// Test Code
var cat = new Cat('fujiawei');

console.log(cat.name);//fujiawei
console.log(cat.sleep());//fujiawei 正在睡覺
console.log(cat.eat());//Uncaught TypeError: cat.eat is not a function( 缺點(diǎn)是第三個 )
console.log(cat instanceof Animal); // false
console.log(cat instanceof Cat); // true

特點(diǎn)

  • 解決了1中绪商,子類實(shí)例共享父類引用屬性的問題
  • 創(chuàng)建子類實(shí)例時苛谷,可以向父類傳遞參數(shù)
  • 可以實(shí)現(xiàn)多繼承(call多個父類對象)

缺點(diǎn)

  • 實(shí)例并不是父類的實(shí)例,只是子類的實(shí)例格郁,這就造成了缺點(diǎn)三
  • 只能繼承父類的實(shí)例屬性和方法腹殿,不能繼承原型屬性/方法
  • 無法實(shí)現(xiàn)函數(shù)復(fù)用,每個子類都有父類實(shí)例函數(shù)的副本例书,影響性能

3锣尉,實(shí)例繼承

function Cat(name){
    var instance = new Animal();
    instance.name = name || 'Tom';
    return instance;
}

// Test Code
var cat = new Cat();

console.log(cat.name);//Tom
console.log(cat.sleep());//Tom正在睡覺
console.log(cat.eat('apple'));//Tom正在吃:apple
console.log(cat instanceof Animal); // true
console.log(cat instanceof Cat); // false

特點(diǎn)

  • 不限制調(diào)用方式,不管是new 子類()還是子類(),返回的對象具有相同的效果
var cat = new Cat()
var cat = Cat()
//1,2步調(diào)用的效果相同

缺點(diǎn)

  • 實(shí)例是父類的實(shí)例决采,不是子類的實(shí)例
  • 不支持多繼承

4自沧,拷貝繼承

function Cat(name){
    var animal = new Animal();
    for(var p in animal){
        Cat.prototype[p] = animal[p];
    }
    Cat.prototype.name = name || 'Tom';
}

// Test Code
var cat = new Cat();

console.log(cat.name);// Tom
console.log(cat.sleep());// Tom正在睡覺!
console.log(cat.eat('apple'));// Tom正在吃:apple
console.log(cat instanceof Animal); // false
console.log(cat instanceof Cat); // true

優(yōu)點(diǎn)

  • 支持多繼承

缺點(diǎn)

  • 效率較低,內(nèi)存占用高(因為要拷貝父類的屬性)
  • 無法獲取父類不可枚舉的方法(不可枚舉方法拇厢,不能使用for in 訪問到)

5爱谁,組合繼承

function Cat(name){
    Animal.call(this);
    this.name = name || 'Tom';
}
Cat.prototype = new Animal();

// Test Code
var cat = new Cat();

console.log(cat.name);//Tom
console.log(cat.sleep());//Tom正在睡覺
console.log(cat.eat('apple'));//Tom正在吃:apple
console.log(cat instanceof Animal); // true
console.log(cat instanceof Cat); // true

特點(diǎn)

  • 彌補(bǔ)了方式2的缺陷,可以繼承實(shí)例屬性/方法孝偎,也可以繼承原型屬性/方法
  • 既是子類的實(shí)例访敌,也是父類的實(shí)例
  • 不存在引用屬性共享問題
  • 可傳參
  • 函數(shù)可復(fù)用

缺點(diǎn)

  • 調(diào)用了兩次父類構(gòu)造函數(shù),生成了兩份實(shí)例(子類實(shí)例將子類原型上的那份屏蔽了)

6衣盾,寄生組合繼承

function Cat(name){
    Animal.call(this);
    this.name = name || 'Tom';
}
(function(){
    // 創(chuàng)建一個沒有實(shí)例方法的類
    var Super = function(){};
    Super.prototype = Animal.prototype;
    //將實(shí)例作為子類的原型
    Cat.prototype = new Super();
})();

Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.sleep());
console.log(cat instanceof Animal); // true
console.log(cat instanceof Cat); //true

特點(diǎn)

  • 堪稱完美

缺點(diǎn)

  • 實(shí)現(xiàn)較為復(fù)雜

最主要的是創(chuàng)建一個空函數(shù)F()寺旺,并將其原型設(shè)置為父級構(gòu)造器,然后我們既可以用new F()來創(chuàng)建一些不包含父對象屬性的對象势决,同時可以從父對象的prototype中繼承一切了阻塑;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市徽龟,隨后出現(xiàn)的幾起案子叮姑,更是在濱河造成了極大的恐慌,老刑警劉巖据悔,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件传透,死亡現(xiàn)場離奇詭異,居然都是意外死亡极颓,警方通過查閱死者的電腦和手機(jī)朱盐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來菠隆,“玉大人兵琳,你說我怎么就攤上這事『Ь叮” “怎么了躯肌?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長破衔。 經(jīng)常有香客問我清女,道長,這世上最難降的妖魔是什么晰筛? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任嫡丙,我火速辦了婚禮,結(jié)果婚禮上读第,老公的妹妹穿的比我還像新娘曙博。我一直安慰自己,他們只是感情好怜瞒,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布父泳。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪惠窄。 梳的紋絲不亂的頭發(fā)上逝她,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機(jī)與錄音睬捶,去河邊找鬼黔宛。 笑死,一個胖子當(dāng)著我的面吹牛擒贸,可吹牛的內(nèi)容都是我干的臀晃。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼介劫,長吁一口氣:“原來是場噩夢啊……” “哼徽惋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起座韵,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤险绘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后誉碴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宦棺,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年黔帕,在試婚紗的時候發(fā)現(xiàn)自己被綠了代咸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡成黄,死狀恐怖呐芥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情奋岁,我是刑警寧澤思瘟,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站闻伶,受9級特大地震影響滨攻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜虾攻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一铡买、第九天 我趴在偏房一處隱蔽的房頂上張望更鲁。 院中可真熱鬧霎箍,春花似錦、人聲如沸澡为。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至顶别,卻和暖如春谷徙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背驯绎。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工完慧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人剩失。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓屈尼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拴孤。 傳聞我的和親對象是個殘疾皇子脾歧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348