總結(jié)六種繼承方式

一屿笼、實例從構(gòu)造函數(shù)的原型身上繼承方法

原理:

任何一個new出來的實例上都可使用原型對象上的方法鸠项,視為最基礎(chǔ)的繼承婚被。(在原型上創(chuàng)建方法和在函數(shù)內(nèi)創(chuàng)建方法都可以繼承)

    function Fn(){
        this.name = "admin";
    }
    // 在原型對象上新建一個方法
    Fn.prototype.show = function(){
        console.log(this.name);
    }
    var f = new Fn();
    console.log(f); //Fn {name: "admin"}
    console.log(f.name);    //admin
   // 實例調(diào)用這個方法
    console.log(f.show);    //f(){console.log(tihs.name)}

二、構(gòu)造函數(shù)繼承

原理:

改變this指向洗做,使用bind(),call(),apply()改變this指向

優(yōu)缺點:
  • 只能繼承構(gòu)造函數(shù)中的屬性和方法弓叛,不能繼承原型上的屬性和方法

  • 簡單方便,創(chuàng)建子類實例時诚纸,可以向父類的構(gòu)造器傳參撰筷;

  • 可以實現(xiàn)多繼承,可以繼承多個構(gòu)造函數(shù)中的內(nèi)容

// 改變this指向畦徘,繼承構(gòu)造函數(shù)中的屬性
function Parent(n,a){
    this.name = n;
    this.age = a;
}
function Child(n,a){
    // 在子構(gòu)造函數(shù)中調(diào)用父構(gòu)造函數(shù)
    Parent.call(this,n,a);  //改變this的指向為child,復制成一個新對象
}

var p = new Parent("大明",48);
var c = new Child("小明",18);
console.log(p);
console.log(c);

三毕籽、原型對象繼承

原理:

通過原型對象prototype來實現(xiàn)繼承

優(yōu)缺點:
  • 可以繼承原型的方法和屬性,不能繼承構(gòu)造函數(shù)的方法和屬性
  function Parent(n){
        this.name = n;
    }
    Parent.prototype.show = function(){
        console.log(this.name);
    }
    
    // 淺拷貝
    // Child.prototype = Parent.prototype;
    
    // 深拷貝
    for(var i in Parent.prototype){
        Child.prototype[i] = Parent.prototype[i];
    }
    function Child(n){
        this.name = n;
    }

    Child.prototype.show = function(){
        console.log("hello");
    }
    
    var p = new Parent("小頭爸爸");
    var c = new Child("大頭兒子");
    // console.log(Parent.prototype);  //{show: ?, constructor: ?}
    p.show();  
    c.show();
    console.log(p);
    console.log(c);
// 淺拷貝     
// Child.prototype = Parent.prototype;

只是改變了地址井辆,子函數(shù)的constructor指向了父函數(shù)的constructor关筒,如果修改子函數(shù)的原型對象的方法,會同時改變父函數(shù)的

image.png

// 深拷貝     
for(var i in Parent.prototype){         
  Child.prototype[i] = Parent.prototype[i];     
}

地址和值都改變杯缺,子函數(shù)的constructor指向不變

image.png

四蒸播、原型鏈繼承

原理:

Child的原型對象指向Parent實例化的對象,Child的實例萍肆,可以訪問Parent構(gòu)造函數(shù)內(nèi)部的this的屬性和原型上的方法

優(yōu)缺點:
  • 既可以繼承構(gòu)造函數(shù)中的方法和屬性袍榆,又可以繼承原型上的方法和屬性

  • 不方便傳參

  • 原型上的屬性是共享的,一個實例修改了原型屬性塘揣,另一個實例的原型屬性也會被修改

function Parent(n,a){
    this.name = n;
    this.age = a;
    this.hi = "hello";
}
Parent.prototype.show = function(){
    console.log(this.name);
}

function Child(n,a,s){
    Parent.call(this,n,a);
    this.score = s;
}
// Child的原型對象指向Parent實例化的對象
Child.prototype = new Parent();
//子的原型對象的constructor被改變包雀,所以需要手動指回
Child.prototype.constructor = Child;
Child.prototype.school = function(){
    console.log("go school");    
}

var p = new Parent("大明",48);
var c = new Child("小明",18,100);
console.log(p);
console.log(c);
console.log(hi);

// Child的原型對象指向Parent實例化的對象 
  Child.prototype = new Parent();
image.png
//子的原型對象的constructor被改變,所以需要手動指回 
  Child.prototype.constructor = Child;
image.png

五勿负、混合繼承

原理:

改變this指向繼承+原型對象繼承

優(yōu)缺點:
  • 既能繼承構(gòu)造函數(shù)中的屬性馏艾,又能繼承構(gòu)造函數(shù)的prototype上的方法
 function Parent(n){
        this.name = n;
    }
    Parent.prototype.show = function(){
        console.log(this.name);
    }

    function Child(n){
        // 改變this指向改變構(gòu)造函數(shù)上的屬性
        Parent.call(this,n);
    }
    
    // 原型對象繼承(深拷貝)原型上的方法
    for(var i in Parent.prototype){
        Child.prototype[i] = Parent.prototype[i];
    }
    // 檢測是改變子構(gòu)造函數(shù)的方法是否影響父構(gòu)造函數(shù)的方法
    // Child.prototype.show = function(){
    //     console.log("hello");
    // }  

    var p = new Parent("小明");
    var c = new Child("小紅");

    p.show();
    c.show();

六、ES6的class類繼承:

原理:

構(gòu)造函數(shù)繼承(改變this指向)+原型鏈繼承

優(yōu)缺點:
  • 既能繼承屬性又能繼承方法

關(guān)鍵字extends:子類可以通過extends繼承父類里面的屬性和方法奴愉;

super關(guān)鍵字:用于訪問和調(diào)用父類上的函數(shù)琅摩;
? ? ? ? 可以調(diào)用父類里面的構(gòu)造函數(shù),也可以調(diào)用父類里面的普通函數(shù)方法锭硼;

class Parent {
    constructor(n){
        this.name = n;
    }
    show(){
        console.log(this.name);
    }
}

class Child extends Parent {    //繼承Parent的屬性和方法
    constructor(n){
        super(n);   //調(diào)用Parent房资,并傳參
    }
    // show(){
    //     console.log("hello");
    // }
}

var p = new Parent("小頭爸爸");
var c = new Child("大頭兒子");
p.show();
c.show();

console.log(p);
console.log(c);
image.png

補充相關(guān)知識點:

構(gòu)造函數(shù)
  • 主要用來初始化對象,即為對象成員變量賦初始值檀头,和new一起使用轰异。把對象中一些公共的屬性和方法抽取出來岖沛,然后封裝到這個函數(shù)里面。
new的作用
  1. 內(nèi)存中創(chuàng)建一個新的空對象搭独;
  2. 讓this指向這個新對象婴削;
  3. 執(zhí)行構(gòu)造函數(shù)里面的代碼,給這個新對象添加屬性和方法牙肝;
  4. 檢查原函數(shù)里有沒有主動返回對象唉俗,沒有就返回新對象(所以構(gòu)造函數(shù)里不需要return)。
原型對象prototype:
  • 每個函數(shù)都有一個prototype屬性配椭,指向另外一個對象虫溜。這個prototype就是一個對象,這個對象的所有屬性和方法股缸,都會被構(gòu)造函數(shù)所擁有衡楞。
  • 可以把不變的方法,直接定義在prototype對象上敦姻,所有對象的實例就可以共享這個方法瘾境。
  • 一般情況下,我們的公共屬性定義到構(gòu)造函數(shù)里面镰惦,公共的方法放到原型對象身上寄雀。
對象原型proto
  • 對象實例里面都會有一個屬性proto指向構(gòu)造函數(shù)的prototype原型對象。

  • 對象原型意義:為對象的查找機制提供一個方向陨献,但是它是一個非標準屬性盒犹,因此在實際開發(fā)中,一般不直接使用眨业,它只能是內(nèi)部指向原型對象prototype


個人學習總結(jié)分享急膀,若有不當之處,歡迎留言交流~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末龄捡,一起剝皮案震驚了整個濱河市卓嫂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌聘殖,老刑警劉巖晨雳,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異奸腺,居然都是意外死亡餐禁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門突照,熙熙樓的掌柜王于貴愁眉苦臉地迎上來帮非,“玉大人,你說我怎么就攤上這事∧┛” “怎么了筑舅?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長陨舱。 經(jīng)常有香客問我翠拣,道長,這世上最難降的妖魔是什么游盲? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任心剥,我火速辦了婚禮,結(jié)果婚禮上背桐,老公的妹妹穿的比我還像新娘。我一直安慰自己蝉揍,他們只是感情好链峭,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著又沾,像睡著了一般弊仪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上杖刷,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天励饵,我揣著相機與錄音,去河邊找鬼滑燃。 笑死役听,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的表窘。 我是一名探鬼主播典予,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼乐严!你這毒婦竟也來了瘤袖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤昂验,失蹤者是張志新(化名)和其女友劉穎捂敌,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體既琴,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡占婉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了甫恩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锐涯。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖填物,靈堂內(nèi)的尸體忽然破棺而出纹腌,到底是詐尸還是另有隱情霎终,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布升薯,位于F島的核電站莱褒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏涎劈。R本人自食惡果不足惜广凸,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蛛枚。 院中可真熱鬧谅海,春花似錦、人聲如沸蹦浦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盲镶。三九已至侥袜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間溉贿,已是汗流浹背枫吧。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宇色,地道東北人九杂。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像宣蠕,于是被迫代替她去往敵國和親尼酿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

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