JavaScript繼承

來自紅寶書的幾種繼承方式

1. 原型鏈繼承

    function SuperClass(){
        this.text = ['hello', 'world'];
    }

    SuperClass.prototype.sayHi = function(){
        console.log(this.text);
    }

    function SubClass(){

    }

    SubClass.prototype = new SuperClass();

    var test1 = new SubClass();
    test1.sayHi();// ["hello", "world"]

    var test2 = new SubClass();
    test2.text.push('shit');

    test1.sayHi(); //["hello", "world", "shit"]  所有實(shí)例引用的都是同一個(gè)值

缺點(diǎn):

  1. 原型的屬性被所有實(shí)例共享
  2. 創(chuàng)建子類時(shí)不能向父類傳參

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

    function SuperClass(data){
        this.text = ['hello', 'world'];
        this.data = data;
        this.sayHi = function(){
            console.log(this.text);
        }
    }

    SuperClass.prototype.sayBye = function(){
        console.log(bye);
    }

    function SubClass(data, name){
        SuperClass.call(this, data);
        this.name = name;
    }

    var test1 = new SubClass();
    test1.sayHi(); //["hello", "world"]

    var test2 = new SubClass();
    test2.text.push('shit');

    test1.sayHi(); //["hello", "world"]
    
    test1.sayBye();//Uncaught TypeError: test1.sayBye is not a function

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

  1. 避免所有實(shí)例共享原型的屬性
  2. 可以向父類傳參
    缺點(diǎn):
  3. 只能繼承父類的實(shí)例屬性袍暴、方法辜荠,不能繼承原型上的屬性瘪松、方法
  4. 方法要在父類構(gòu)造函數(shù)中定義贪绘,每次創(chuàng)建子類實(shí)例都會(huì)創(chuàng)建一個(gè)方法的副本缩赛。子類實(shí)例間的方法相同卻不能復(fù)用昧狮。

3. 組合繼承

將原型鏈繼承和借用構(gòu)造函數(shù)繼承組合起來使用

    function SuperClass(name) {
        this.text = ['hello', 'world'];
        this.name= name;
        this.sayHi = function () {
            console.log(this.name);
        }
    }

    SuperClass.prototype.sayBye = function () {
        console.log('bye');
    }

    function SubClass(name) {
        SuperClass.call(this, name);
    }

    SubClass.prototype = new SuperClass();
    SubClass.prototype.constructor = SubClass;


    var test1 = new SubClass('one');
    var test2 = new SubClass('two');

    test1.sayHi(); //one
    test2.sayHi(); //two
    test2.sayBye(); //bye

缺點(diǎn):
調(diào)用了兩次父類構(gòu)造函數(shù)酿联,實(shí)例和原型有一樣的屬性的方法。
一個(gè)來自于SuperClass.call(this, data);
一個(gè)來自于SubClass.prototype = new SuperClass()


image.png

4. 原型式繼承

利用一個(gè)空函數(shù)作為中介扮饶,進(jìn)行原型的連接淮韭。

    //這個(gè)操作其實(shí)就是ES5里面的Object.create
    function inherits(obj) {
        function F() { }
        F.prototype = obj;
        return new F();
    }


    function SuperClass(name) {
        this.text = ['hello', 'world'];
        this.name = name;
        this.sayHi = function () {
            console.log(this.name);
        }
    }

    SuperClass.prototype.sayBye = function () {
        console.log('bye');
    }

    var parent = new SuperClass('test');
    var child1 = inherits(parent);
    var child2 = inherits(parent);

    child1.sayHi(); //test
    child1.sayBye(); //bye

    child1.text.push('shit');
    console.log(child2.text); //["hello", "world", "shit"] 實(shí)例共享父類屬性

缺點(diǎn):與原型鏈繼承相同

5. 寄生式繼承

和原型式繼承一個(gè)意思

function createObj (o) {
    var clone = Object.create(o);
    clone.sayName = function () {
        console.log('hi');
    }
    return clone;
}

缺點(diǎn):與原型式繼承相同

6. 寄生組合繼承

利用空函數(shù)來連接原型,代替組合繼承中的SubClass.prototype = new SuperClass()贴届,減少了一次父類構(gòu)造調(diào)用

    function SuperClass(name) {
        this.text = ['hello', 'world'];
        this.name = name;
        this.sayHi = function () {
            console.log(this.name);
        }
    }

    SuperClass.prototype.sayBye = function () {
        console.log('bye');
    }

    function SubClass(name) {
        SuperClass.call(this, name);
    }

    var F = function(){};
    F.prototype = SuperClass.prototype;
    SubClass.prototype = new F();
    //以上三行相當(dāng)于
    //SubClass.prototype =  Object.create(SuperClass.prototype)

    var test1 = new SubClass('one');
    var test2 = new SubClass('two');

    test1.sayHi(); //one
    test2.sayHi(); //two
    test2.sayBye(); //bye

總結(jié):
最好的繼承方式是寄生組合繼承

    function SubClass() {
        SuperClass.call(this);
    }
    SubClass.prototype = Object.create(SuperClass.prototype);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子毫蚓,更是在濱河造成了極大的恐慌占键,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件元潘,死亡現(xiàn)場(chǎng)離奇詭異畔乙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)翩概,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門牲距,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人钥庇,你說我怎么就攤上這事牍鞠。” “怎么了评姨?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵难述,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我吐句,道長(zhǎng)胁后,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任嗦枢,我火速辦了婚禮攀芯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘文虏。我一直安慰自己侣诺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布择葡。 她就那樣靜靜地躺著紧武,像睡著了一般。 火紅的嫁衣襯著肌膚如雪敏储。 梳的紋絲不亂的頭發(fā)上阻星,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音已添,去河邊找鬼妥箕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛更舞,可吹牛的內(nèi)容都是我干的畦幢。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼缆蝉,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼宇葱!你這毒婦竟也來了瘦真?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤黍瞧,失蹤者是張志新(化名)和其女友劉穎诸尽,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體印颤,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡您机,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了年局。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片际看。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖矢否,靈堂內(nèi)的尸體忽然破棺而出仲闽,到底是詐尸還是另有隱情,我是刑警寧澤兴喂,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布蔼囊,位于F島的核電站,受9級(jí)特大地震影響衣迷,放射性物質(zhì)發(fā)生泄漏畏鼓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一壶谒、第九天 我趴在偏房一處隱蔽的房頂上張望云矫。 院中可真熱鬧,春花似錦汗菜、人聲如沸让禀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽巡揍。三九已至,卻和暖如春菌瘪,著一層夾襖步出監(jiān)牢的瞬間腮敌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工俏扩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留糜工,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓录淡,卻偏偏與公主長(zhǎng)得像捌木,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嫉戚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

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

  • 前言 也許學(xué)過JavaScript繼承方式的朋友都知道刨裆,自定義引用類型的最佳繼承方式非寄生組合繼承方式莫屬澈圈;然而,...
    阿爾卑斯的隆冬閱讀 632評(píng)論 0 1
  • 本文是本人學(xué)習(xí)崔拥,張容銘著的《Javascript 設(shè)計(jì)模式》的筆記與總結(jié)极舔。僅供學(xué)習(xí)交流。 每個(gè)類都有3個(gè)部分: 1...
    Joyanceh閱讀 779評(píng)論 1 2
  • 繼承的概念:子類可以使用父類共享的屬性和方法链瓦,避免重復(fù)代碼提高代碼復(fù)用性。 原型鏈:子類可以共享父類的實(shí)例對(duì)象和實(shí)...
    淺秋_6672閱讀 397評(píng)論 0 0
  • 例子 我們生成兩個(gè)構(gòu)造函數(shù)盯桦,后面的例子都是讓‘’貓‘’繼承‘’動(dòng)物‘’的所有屬性和方法慈俯。 動(dòng)物(為了更好的理解各種...
    流光號(hào)船長(zhǎng)閱讀 320評(píng)論 0 1
  • 結(jié)完了這個(gè)月的賬,我和小胖子走在下班回去的路上拥峦, 看著同事們遺下的笑容結(jié)伴而去贴膘, 硬性道別的方式有很多種, 我想還...
    盧荒年閱讀 235評(píng)論 2 2