请用多种方式在 JavaScript 里实现继承,并要求给出具体代码示例,尽可能覆盖不同写法。
考察说明
考查对 JavaScript 继承机制的理解与多种实现方式的掌握程度。
回答思路
- 【回答框架 1】原型链继承是 JavaScript 最基本的继承方式,通过让子类的原型指向父类实例实现,缺点是实例共享引用类型属性,且无法向父类构造函数传参。
- 【回答框架 2】构造函数继承通过在子类构造函数中调用父类构造函数(使用 call 或 apply)实现,可传参且实例属性独立,但无法复用原型上的方法。
- 【回答框架 3】组合继承结合原型链和构造函数,既能传参又能复用方法,但会调用两次父类构造函数,导致子类原型上多出无用属性。
- 【回答框架 4】原型式继承通过 Object.create 创建以现有对象为原型的对象,适合简单场景,ES5 中可用。
- 【回答框架 5】ES6 的 class 与 extends 语法糖是更现代且推荐的方式,底层仍是原型链,但语义更清晰,支持 super 调用父类方法。
- 【关键点 1】原型链继承共享引用属性风险高。
- 【关键点 2】组合继承会调用两次父类构造函数。
- 【关键点 3】Object.create 实现原型式继承。
- 【关键点 4】ES6 class extends 是主流推荐。
- 【关键点 5】寄生组合式继承是 ES5 的最佳实践。
- 【易错点 1】不要混淆原型链与 instanceof 判断,instanceof 只能检查原型链上的构造器。
- 【易错点 2】箭头函数不能作为构造函数,无法进行继承。
- 【易错点 3】修改子类原型上的引用类型属性可能影响所有实例。