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‘))
特点:
- 堪称完美
缺点:
- 实现较为复杂
推荐指数:★★★★(实现复杂,扣掉一颗星)
聊一聊JS的继承
原文地址:https://www.cnblogs.com/yiyi17/p/8430827.html