JavaScript繼承方式

總結一下關於JavaScript繼承方式
1,構造函數式--構造函數式繼承
式繼承
function  Super(){
    this.colors = ['c','a','b'];
    this.print = function(){
        console.log(this.colors);
    }
}

Super.prototype.prototypePrint=function(){
    console.log(this.colors);
}

function Sub(){
    Super.call(this);
}
var instance1 = new Sub();
instance1.colors.push('v');
instance1.print();//c,a,b,v
console.log(instance1.colors);   //c,a,b,v
instance1.prototypePrint();//instance1.prototypePrint is not a function

var instance2 = new Sub();
instance2.print();//c a b
console.log(instance2.colors);//c a b
instance2.prototypePrint();//instance1.prototypePrint is not a function
實現了屬性的私有,沒有實現方法的共享,方法都在構造函數中定義,所以沒法複用,可使用構造函數內定義的方法,在超類型(父類)的原型中定義的方法,對子類型而言是不能使用的。

2,原型鏈式--原型鏈式繼承
//原型鏈式--原型鏈式繼承--原型鏈繼承
    function  Super(){
        this.colors = ['c','a','b'];
        this.print = function(){
            console.log(this.colors);
        }
    }
    Super.prototype.prototypePrint=function(){
        console.log(this.colors);
    }

    function Sub(){

    }

    Sub.prototype = new Super();

    var instance1 = new Sub();
    instance1.colors.push('v');
    console.log(instance1.colors);//c,a,b,v
    instance1.prototypePrint();//c,a,b,v

    var instance2 = new Sub();
    console.log(instance2.colors);//c a b v
    instance2.prototypePrint();//c a b v
實現了方法的共享方法和屬性全都被共享了,不能實現屬性的私有。

3,組合式繼承
function  Super(){
        this.colors = ['c','a','b'];
    }
    Super.prototype.print = function(){
        console.log(this.colors);
    };

    Super.prototype.prototypePrint=function(){
        console.log(this.colors);
    }
    function Sub() {
        Super.call(this);//
    }

    Sub.prototype = new Super();//
    Sub.prototype.constructor = Sub;

    var instance1 = new Sub();
    instance1.colors.push('v');
    console.log(instance1.colors);  //a b c v
    instance1.prototypePrint();  //a b c v

    var instance2 = new Sub();
    console.log(instance2.colors);   //a b c
    instance2.prototypePrint();  //a b c

//Sub.prototype = new Super();這一句把supercolor數組共享到sub的原型上了。
//Super.call(Sub)這一句把supercolor數組複製到sub上了
//子類實例將子類原型上的屏蔽了
第二次第一次
實現了函數的共享,也實現了屬性的私有。
組合式繼承是最經常使用的繼承模式,但組合繼承的超類型在繼承過程當中會使用兩次,一次是建立子類型的時候,另外一次是在子類型構造函數的內部。
js
相關文章
相關標籤/搜索