前端 JavaScript 进阶面试题, JavaScript 中对象继承的方式有哪些?
前端 JavaScript 进阶面试题, JavaScript 中对象继承的方式有哪些?
QA
Step 1
Q:: JavaScript 中对象继承的方式有哪些?
A:: JavaScript 中对象继承的方式主要有四种:1. 原型链继承:通过将子类的原型对象设置为父类的实例来实现继承。2. 构造函数继承:在子类的构造函数中调用父类的构造函数。3. 组合继承:结合原型链继承和构造函数继承,通过调用父类的构造函数继承属性,通过将子类的原型对象设置为父类的实例继承方法。4. ES6
中的 class 继承:通过使用 class 关键字和 extends 关键字来实现继承。
Step 2
Q:: 原型链继承的缺点是什么?
A:: 原型链继承的主要缺点是:1. 子类实例共享父类实例的引用属性,修改一个实例的引用属性会影响所有实例。2.
在创建子类实例时,无法向父类构造函数传参。
Step 3
Q:: 如何避免原型链继承的缺点?
A:: 可以通过组合继承或 ES6 的 class 继承来避免原型链继承的缺点。组合继承将构造函数继承和原型链继承结合起来,既可以共享方法,又可以在创建子类实例时向父类构造函数传参。ES6
的 class 继承语法更简洁,并且解决了上述问题。
Step 4
Q:: JavaScript 中的寄生组合继承是什么?
A:: 寄生组合继承是结合组合继承和寄生继承的一种方式,通过原型链实现方法的继承,通过构造函数实现属性的继承,并且避免了组合继承中的效率问题。具体实现方式是:通过 Object.
create 创建一个父类原型的副本,并将这个副本赋值给子类的原型,然后在子类构造函数中调用父类构造函数。
Step 5
Q:: ES6
class 继承的实现原理是什么?
A:: ES6
的 class 继承本质上是基于原型链的继承。class 关键字只是语法糖,它背后依然使用了原型链和构造函数的机制。extends 关键字用于设置子类的原型对象和父类的原型对象的关系,super 关键字用于调用父类的构造函数和方法。