在js中, 很多地方需要使用到继承, 废话少说, 今天来聊一聊js几种继承方式的优缺点
-
构造函数继承
function Parent(){ let arr=[1,2,3,4] } function Child(){ Parent.call(this); // this === Parent1 }
- 缺点: Parent 上的原型链不能被子类继承
-
原型链继承
function Parent(){ let arr=[1,2,3,4] } function Child(){ Parent.call(this); // this === Parent1 } Child.prototype = new Parent();
缺点:
- 如果父类中的属性值改变(例如数组), 所有子类的实例中对应的都会改变
-
组合继承
function Parent(){ let arr=[1,2,3,4] }
function Child() {
Parent.call(this);
}
Child.protype = new Parent();缺点:
父类的构造函数会被指向两次
-
child = new Child() ;
child instanceof Child // true
child instanceof Parent // true
不能区分实例到底是父类的实例, 还是子类的实例
-
组合继承的优化(推荐使用这种方式)
function Parent(){ let arr=[1,2,3,4] } function Child() { Parent.call(this); } Child.prototype = Object.create(Parent.prototype); // 把显示原型放在子类的显示原型上 child.prototype.constructor = Child() // 构造函数等于该函数本身