前言
为大家分享js中最常见最详细的继承方式,接下来将一下面的几个维度进行展示说明
文章有点长,请耐心阅读& # 128513;,有什么错误理解的地方希望留言指出来
-
<李>产生原因李>
<李>代码实现李>
<李>基本原理李>
<李>语言实现李>
<李>场景优点李>
<李>缺点李>
继承方式
-
<李>原型链继承李>
<李>借用构造函数模式继承李>
<李>组合继承李>
<李>原型式继承李>
<李>寄生式继承李>
<李>寄生组合李>
原型链继承
相信小伙伴们都知道到原型链继承(ECMAScript中描述了原型链的概念,并将原型链作为实现继承的主要方法),因为原型链继承非常的强大,但是也有它的缺点,接下来咱们就按照上面的维度看看原型链继承到底是什么鬼
代码实现:(需要两个构造函数来完成一个原型链继承)
//父型构造函数称为超类 函数的超类型(){ this.name='超级'; this.friend=[]; 这一点。财产=true; } SuperType.prototype.getName=function () { 返回this.name; } SuperType.prototype。getSuperValue=https://www.yisu.com/zixun/function () { 返回this.property; };//子类型构造函数称为子类 函数亚型(姓名、年龄){ this.name=名称; this.age=年龄; 这一点。subproperty=false; } 亚型。原型=new超类型(); SubType.prototype.constrcutor=亚型; SubType.prototype.getAge=function () { 返回this.age; } SubType.prototype。getSubValue=function () { 返回this.subproperty; }; var孩子=新的亚型(‘闪亮’,12); console.log (child.getName)//闪亮 console.log (child.getAge ())//12 >之前图解部分属性
<>强基本原理强>
使用类似作用域的原型链,进行继承查找
<>强语言实现强>
定义两个构造函数,分别为父类(超类型),子类(亚型),为了实现子类能够使用父类的属性(本身和原型上面的属性)。重写子类的原型,让子类的原型指向父类实例,这样子类的构造函数就是父类的实例地址,实现子类可以使用父类的本身和原型上的属性
<>强优点强>
子类可以通过原型链的查找,实现父类的属性公用与子类的实例
<强>缺点,,强>
<李>一些引用数据操作的时候会出问题,两个实例会公用继承实例的引用数据类李> <李>谨慎定义方法,以免定义方法也继承对象原型的方法重名李> <李>无法直接给父级构造函数使用参数李>
借用构造函数模式继承
虽然原型链继承很强大但是也有他的缺点,借用构造函数继承可以解决原型链继承的缺点,开线面的解释
代码实现:
//把父类当中一个函数使用 函数的超类型(名字){ this.name=名字 this.friend=[a, b] } SuperType.prototype.getFriend=function () { 返回this.firend } 函数亚型(名字){//执行父类函数 SuperType.call(这名字); } var孩子=新的亚型(“的”) var平安幸福=new亚型(红色的) console.log (child.name)//闪亮 console.log (childRed.name)//红色 child.firend.push (“c”) console.log (child.friend)//a, b, c console.log (childRed.friend)//a, b console.log (childRed.getFriend)//定义 >之前<>强基本原理强>
使用电话应用方法,通过执行方法修改这(上下文),是的父级的这个变成子类实例的,这样每个实例都会得到父类的属性,实现引用属性备份
<强>使用场景强>
父类中需要一些子类使用共享的引用类型,并且子类可能会操作父类共享的引用类型
但是父类的非这绑定的属性和方法是不可以使用的(放在父类原型的属性和方法)<>强语言实现强>
不要把父类当中构造函数,当中一个函数来处理这样更容易理解,在子类的构造函数中借用父类函数通过修改这来执行,这样子类的实例包含父类的属性
<>强优点强>
<李>解决了原型链继承的引用类型操作问题
史上最为详细的javascript继承(推荐)