js6种继承方式

首先我们要提供一个父类

function Person(name,date){
    this.name=name;
    this.date=date;
    this.sum=function(){
        console.log(this.name)
    }
}
Person.prototype.age=10; //给构造函数添加原型属性

原型链继承:

function Per(){
    this.name="ker"
}
Per.prototype=new Person();  //新实例的原型等于父类的实例
var per1=new Per();
console.log(per1.name); //10
console.log(per1 instanceof Person); //true

原型链可继承的属性有:实例的构造函数的属性,父类构造函数属性,父类原型的属性
缺点:1.新实例不可想父类传参,只能单方面的接受。
2.所有的新实例都公用父类属性,只要父类发生改变则都会发生改变,牵一发而动全身。
借用构造函数继承:

function Con(){
    Person.call(this,"jer","12/17"); //用.call()和.apply()将父类构造函数引入子类函数(在子类函数中做了父类函数的自执行(复制))
    // this.age=12
}
var con1=new Con();
console.log(con1.name);
console.log(con1.date);
console.log(con1.age); //不能继承父类原型的属性
console.log(con1 instanceof Person); //false

借用构造函数继承他只能继承父类构造函数的属性,而不能继承他的原型属性,其根本原因就是父类构造函数仅仅只是在子类函数内部复制而已。同样我们也可以利用call()和apply()来继承多个构造函数
缺点:1.只能继承父类构造函数的属性,而不能继承他的原型属性。
2.无法实现对构造函数的复用。
2.每一个新实例都要有父类的钩爪函数而显得臃肿。
组合继承

function SubType(name){
    Person.call(this,name);
}
SubType.prototype=new Person(); //原型链继承
var sub = new SubType("gar");
console.log(sub.name);//"gar"继承了构造函数属性
console.log(sub.age);//10继承了父类原型的属性

组合继承顾名思义是结合了上面两种的继承的特点,同时也解决了上面两种的缺点,因此在平时也更加常用。
缺点:两次调用构造函数耗内存,
原型式继承

function content(obj){
    obj.a=11
    function F(){} 
    F.prototype=obj; //传入参数
    return new F(); //返回函数对象
}
var sup=new Person(); 
var sup1=content(sup)
console.log(sup1.a);//11

原型式继承用一个函数包装一个对象,然后返回这个函数的调用,这个函数就变成了个可以随意增添属性的实例或对象。
缺点:1.所有实例都会继承原型上的属性。
2.无法实现复用。(新实例属性都是后面添加的)

寄生式继承


你可能感兴趣的:(js6种继承方式)