组合式继承:将类式继承同构造函数继承组合使用,但是存在一个问题,子类不是父类的实例,而子类的原型式父类的实例,所以才有了寄生组合式继承。
意思就是说,寄生就是寄生式继承,寄生式继承就是依托于原型继承,原型继承又与类式继承差不多,所以另外一种继承模式应该是构造函数继承。当然子类不是父类的实例的问题是由于类式继承引起的。
说道这,我不得不说一下,道格拉斯大哥对寄生式继承的改造
function inheritPrototype(subClass,superClass){ //复制一份父类的原型副本保存在变量中 var p = inheritObject(superClass.prototype); //修正因为重写子类原型导致子类的construction属性被修改 p.constructor = subClass; //设置子类的原型 subClass.prototype = p; }
我们需要的是继承仅仅是父类的原型,不再需要调用父类的构造函数。
测试一下
//定义父类 function SuperClass(name){ this.name = name; this.colors = ['red','blue','green']; } //定义父类原型的方法 SuperClass.prototype.getName = function(){ console.log(this.name); } //定义子类 function SubClass(name,time){ //构造函数式继承 SuperClass.call(this.name); //子类新增属性 this.time = time; } //寄生式继承父类原型 inheritPrototype(SubClass,SuperClass); //子类新增原型方法 SubClass.prototype.getTime = function(time){ console.log(this.time); } //创建两个测试方法 var instance1 = new SubClass('js book',2014); var instance2 = new SubClass('css book',2013);
我们首先创建父类,以及父类的原型方法,
然后创建子类,并在构造函数中实现构造函数式继承,
然后又通过寄生式继承了父类原型,
最后又对子类添加一些原型方法。
instance1.colors.push('black'); console.log(instance1.colors); //['red','blue','green','black'] console.log(instance2.colors); //['red','blue','green'] instance1.getName(); //css book instance2.getTime(); //2013
注意:子类再想添加原型方法必须通过prototype对象,通过点语法的形式一个一个添加方法,否则会被直接赋予对象就会覆盖掉从父类原型继承的对象。