继承
组合继承
也叫伪经典继承
原型链+借用构造函数
原型链继承:子类的原型指向父类的实例,可以使得子类的实例隐式指向父类的实例,从而指向父类的原型
借用构造函数:子类(子构造函数)中通过SuperType.call(this)方法定义和父类一样的实例属性
实例属性:构造函数构造实例后实例取得的属性,不同实例具有不同的实例属性
构造函数的原型指明将来构造的实例隐式指向谁,构造函数里实例属性的定义指明将来构造实例时为实例增加什么实例属性。
理解:
(父类指的是父构造函数)
由于子类原型指向的是父类的实例,所以当父类构造函数定义了实例属性时,子类原型若没有定义实例属性,则根据子类构造函数构造的子类实例访问该实例属性时访问的是父类构造函数构造的实例的实例属性。
在这种情况下,所有子类实例访问到的都是同一个实例属性,从任何一个子类实例修改这个实例属性,实际上都是在修改父类实例的实例属性,从而造成这种修改会波及所以子类实例。
为了解决这种问题,子类需要借用父类的构造函数,通过在子类构造函数中定义与父类一样的实例属性,使得子类实例在访问实例属性时首先访问自己的实例属性,从而保证了所有的子类实例在修改自己的实例属性时,不影响其他子类实例的实例属性。
实例们公共使用的方法或属性放到原型中,通过原型链取用。
各实例自己使用的属性通过在构造函数中声明实例属性取得。
组合继承的不足
父类会调用两次
子类原型指向父类实例时,父类执行实例化操作
子类原型执行实例化操作时,调用父类(不把其当构造函数,而是当作普通函数调用)获取实例属性
子类声明和父类一样的实例属性
父类在父类原型的基础上添加了实例属性
子类指向的是父类的实例,于是子类原型有这些实例属性,但是由于实例属性应该是每个实例独有的,所以子类不应直接访问父类实例的实例属性,而应该有自己的实例属性,所以应该在子类构造函数中声明父类构造函数中声明的所有实例属性,从而使得每个子类的实例都拥有其父类的实例的实例属性。
父类在父类原型的基础上添加了实例属性,本意是让其实例拥有不同的实例属性
子类继承了父类,也应该继承父类的意图,让子类的实例在访问这些实例属性名的时候得到各自的值,于是子类只能在子类构造函数中声明父类的这些实例属性,从而使得不同子类实例拥有不同的实例属性
- Post title:javascript组合继承
- Post author:Willem Zhang
- Create time:2021-11-20 09:05:09
- Post link:https://ataraxia.top/2021/11/20/javascript组合继承/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.