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最常用的继承模式,但组合继承的超类型在继承过程中会使用两次,一次是创建子类型的时候,另一次是在子类型构造函数的内部。



 
 
 
 
posted @ 2018-03-29 16:05  佐佐19900525  阅读(125)  评论(0编辑  收藏  举报