面试题答案
一键面试原型链继承
- 优点:
- 实现简单,通过原型链让子类型访问父类型的属性和方法,非常直观。
- 父类型的属性和方法在所有子类型实例间共享,节省内存。
- 缺点:
- 无法在不影响所有实例的情况下,为子类型的实例单独设置父类型的属性。
- 不能向父类型构造函数传递参数,不利于复用父类型的初始化逻辑。
- 原型中包含引用类型值时,所有实例共享,一个实例修改会影响其他实例。
- 适用场景:当需要简单地共享父类型的属性和方法,且这些属性和方法不会被实例单独修改,不涉及向父类型传递初始化参数时适用。
构造函数继承
- 优点:
- 可以在子类型构造函数中向父类型构造函数传递参数,灵活初始化父类型属性。
- 每个子类型实例都有自己独立的属性,不会相互影响。
- 缺点:
- 父类型的方法不能被复用,每个子类型实例都有自己的一套方法,浪费内存。
- 仅继承了父类型的实例属性和方法,没有继承父类型原型上的属性和方法。
- 适用场景:当需要为每个子类型实例创建独立的属性,且不关心父类型原型方法的复用,需要向父类型传递初始化参数时适用。
组合继承
- 优点:
- 融合了原型链继承和构造函数继承的优点,既可以复用父类型原型上的方法,又能为每个子类型实例创建独立的属性,还能向父类型构造函数传递参数。
- 缺点:
- 父类型构造函数会被调用两次,一次在子类型构造函数中,一次在设置子类型原型时,造成不必要的性能开销。
- 适用场景:在大多数情况下都适用,能较好地满足继承的多种需求,但如果性能要求极高,该缺点可能会成为问题。
寄生组合继承
- 优点:
- 修复了组合继承中父类型构造函数被调用两次的问题,性能更优。
- 保留了组合继承的所有优点,既复用了父类型原型上的方法,又能为子类型实例创建独立属性并传递参数。
- 缺点:
- 实现相对复杂一些,需要理解原型链和构造函数的底层原理。
- 适用场景:追求高性能且需要全面的继承特性时适用,是最推荐的继承方式。