1、组合继承
// 组合继承 function Animal(){ this.name=name||‘Animal‘; this.sleep=function(){ console.log(this.name+‘sleep‘); } } Animal.prototype.eat=function(food){ console.log(this.name+‘eat‘+food); } function Cat(name){ Animal.call(this);//继承实例属性/方法,也可以继承原型属性/方法 this.name=name||‘tom‘;//调用了两次父类构造函数,生成了两份实例(子类实例将子类原型上的那份屏蔽了) } Cat.prototype=new Animal(); Cat.prototype.constructor=Cat;//组合继承也是需要修复构造函数指向的。 var cat = new Cat();//既是子类的实例,也是父类的实例 console.log(Cat.prototype.constructor); console.log(cat.name) console.log(cat.eat(‘haha‘))//可传参
特点:
可以继承实例属性/方法,也可以继承原型属性/方法
- 既是子类的实例,也是父类的实例
- 不存在引用属性共享问题
- 可传参
- 函数可复用
缺点:
- 调用了两次父类构造函数,生成了两份实例(子类实例将子类原型上的那份屏蔽了)
推荐指数:★★★★(仅仅多消耗了一点内存)
2、寄生组合继承
寄生组合继承 function Animal(){ this.name=name||‘Animal‘; this.sleep=function(){ console.log(this.name+‘sleep‘); } } Animal.prototype.eat=function(food){ console.log(this.name+‘eat‘+food); } function Cat(name){ Animal.call(this); this.name=name||‘tom‘; } (function(){ var Super=function(){};// 创建一个没有实例方法的类 Super.prototype=Animal.prototype; Cat.prototype=new Super(); //将实例作为子类的原型 })() Cat.prototype.constructor = Cat; var cat=new Cat(); console.log(cat.eat(‘haha‘))
特点:
- 堪称完美
缺点:
- 实现较为复杂
推荐指数:★★★★(实现复杂,扣掉一颗星)