繼承

1.原型鏈

// 基本思想是利用原型讓一個引用類型繼承另一個引用類型的屬性和方法 
     function SuperType () {
        this.superValue = true; 
    }

    SuperType.prototype.getSuperValue = function () {
        return this.superValue;
    }

    function SubType () {
        this.subValue = false;
    }
    // 繼承SuperType
    SubType.prototype = new SuperType();

    SubType.prototype.getSubValue = function () {
        return this.subValue
    }

    var instance = new SubType();

    console.log(instance.getSuperValue()); // true

    // 這樣會有一個問題,當(dāng)SubType的一個實(shí)例改變了其中的一個屬性,其所有的實(shí)例都被更改了這個屬性

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

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

    function SubType () {
        SuperType.call(this);
    }

    var instance1 = new SubType();
    instance1.colors.push('black');
    console.log(instance1.colors); // ["red", "blue", "green", "black"]

    var instance2 = new SubType();
    console.log(instance2.colors); // ["red", "blue", "green"]

3.組合繼承

    function SuperType (name) {
        this.name = name;
        this.colors = ['red', 'blue', 'green'];
    }

    SuperType.prototype.sayName = function () {
        console.log(this.name);
    }

    function SubType (name, age) {
        // 繼承屬性
        SuperType.call(this, name);
        this.age = age;
    }

    // 繼承方法
    SubType.prototype = new SuperType();

    SubType.prototype.sayAge = function () {
        console.log(this.age);
    }

    var instance1 = new SubType('silva', 26);
    instance1.colors.push('black');
    console.log(instance1.colors)
    instance1.sayName();
    instance1.sayAge();

    var instance2 = new SubType('mike', 16);
    console.log(instance2.colors)
    instance2.sayName();
    instance2.sayAge();

  // 組合繼承避免了原型鏈和構(gòu)造函數(shù)的缺陷,融合了它們的優(yōu)點(diǎn)

4.寄生組合式繼承

    function SuperType (name) {
        this.name = name;
        this.colors = ['red', 'blue', 'green'];
    }

    SuperType.prototype.sayName = function () {
        console.log(this.name);
    }

    function SubType (name, age) {
        // 繼承屬性
        SuperType.call(this, name);
        this.age = age;
    }

    // 繼承方法
    SubType.prototype = new SuperType();
    // 修正constructor屬性
    SubType.prototype.constructor = SubType;
    SubType.prototype.sayAge = function () {
        console.log(this.age);
    }

    var instance1 = new SubType('silva', 26);
    instance1.colors.push('black');
    console.log(instance1.colors)
    instance1.sayName();
    instance1.sayAge();

    var instance2 = new SubType('mike', 16);
    console.log(instance2.colors)
    instance2.sayName();
    instance2.sayAge();
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容