前几天重温了一下js的继承,今天分享给大家:
一,类式继承。
所谓的类式继承就是:第二个类的原型prototype被赋予了第一个类的实例,如subcals.prototype=new supercls();
原理:新创建的对象复制了父类的构造函数内的属性和方法,并且将原型_proto_指向了父类的原型对象;
虽然是继承了但是也是有缺点的,由于父类通过其原型prototype对父类实例化继承了父类,所以说父类中的属性和方法也成了引用类型,就会在引用类共用,因此只要一个子类中改变了原型中的父类构造函数那么就会直接影响其他子类对这个父类的引用。
二,构造函数继承。
所谓构造函数继承就是在原型函数中使用call,和apply 。(具体区别就不在这里细说了)
superclass.call(this);
原理:对superClass调用这个方法就是将子类中的变量在父类中执行一遍,由于父类中是this绑定属性的,因此子类自然也就继承了父类的共有属性。
缺点:由于这种类型的继承没有涉及到原型Prototye,所以父类的原型方法自然不会被子类继承。
三,组合继承
原理:在子类构造函数中执行父类构造函数,在子类原型上实例化父类就是组合继承模式。这样就融合了类式继承和构造函数继承的优点,但是也并不是没有缺点了。
我们在使用构造函数继承时又调用了一遍父类的构造函数,而在实现子类的原型的类式继承时调用了一遍父类的构造函数,因此调用了两遍。(虽然有缺点但是在我的代码中出现的频率还是挺高的不知道大家怎么使用的)
四,原型继承;
原理:根据已有的对象创建一个新的对象,同时不必创建新的自定义对象类型。
function inheritobject(0){
function f(){}
f.prototype=o;
return new f();
}
缺点:与类式继承一样,引用类型;
五,寄生继承。
寄生继承就是对原型继承的第二次分装,并且在这个第二次封装中对继承的对象进行了扩展,这样新创建的对象不仅有父类中的属性和方法而且还添加新的属性方法。
六,寄生组合继承。
顾名思义就是寄生式继承和组合继承的结合体。