MST
星途 面试题库

面试题:JavaScript在复杂继承体系下为已有类添加方法的优化策略

假设有一个复杂的继承体系,基类`Animal`有多个子类,如`Dog`、`Cat`等,它们都继承自`Animal`。`function Animal(species) { this.species = species; }`,`function Dog(name) { Animal.call(this, 'dog'); this.name = name; }`,`Dog.prototype = Object.create(Animal.prototype);`,`Dog.prototype.constructor = Dog;`。现在要为所有子类添加一个通用方法`makeSound`,要求这个方法的添加不会影响现有继承体系,同时要考虑到代码的可维护性和性能。请提供详细的优化代码方案,并阐述背后的设计思想。
49.7万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

优化代码方案

// 定义基类Animal
function Animal(species) {
    this.species = species;
}

// 定义子类Dog
function Dog(name) {
    Animal.call(this, 'dog');
    this.name = name;
}
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;

// 为所有子类添加通用方法makeSound
Animal.prototype.makeSound = function() {
    return `I am a ${this.species}`;
};

// 测试
const myDog = new Dog('Buddy');
console.log(myDog.makeSound()); 

设计思想阐述

  1. 不影响现有继承体系:通过在Animal.prototype上添加makeSound方法,所有继承自Animal的子类都会自动获得这个方法,因为JavaScript基于原型链继承。这样不会破坏原有的Object.create创建原型链以及手动设置constructor的继承关系。
  2. 可维护性:将通用方法添加到基类的原型上,使得代码具有一致性和集中性。如果后续需要修改makeSound方法的逻辑,只需要在Animal.prototype.makeSound这一处进行修改,所有子类都会受到影响,避免了在每个子类中重复修改代码,降低了维护成本。
  3. 性能:JavaScript的原型链机制使得在原型上添加方法不会为每个实例重复创建方法,而是所有实例共享原型上的方法。当调用makeSound方法时,JavaScript引擎会沿着原型链查找该方法,这种机制在内存使用和性能方面都有较好的表现,特别是在有大量实例的情况下。