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