面试题答案
一键面试1. 类的多态性在 JavaScript 基于原型链继承体系下的体现原理
在 JavaScript 基于原型链的继承体系中,多态性体现在同一操作作用于不同的对象时,可以有不同的解释,产生不同的执行结果。当通过原型链实现继承时,子类可以继承父类的属性和方法。如果子类中重写了从父类继承的方法,那么在调用该方法时,会优先使用子类重写后的方法,而不是父类的方法,这就体现了多态性。
这是因为 JavaScript 在查找对象的属性或方法时,会先在对象自身查找,如果找不到则沿着原型链向上查找。子类对象在查找方法时,会先在自身的属性和方法中查找,找到重写的方法就直接使用,而不会再去原型链上找父类的同名方法。
2. 子类重写方法实现多态时原型链的影响
例如:
function Animal() {}
Animal.prototype.speak = function() {
console.log('I am an animal');
};
function Dog() {}
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
Dog.prototype.speak = function() {
console.log('I am a dog, woof!');
};
let animal = new Animal();
let dog = new Dog();
animal.speak(); // 输出: I am an animal
dog.speak(); // 输出: I am a dog, woof!
在上述代码中,Dog
继承自 Animal
,Dog
重写了 speak
方法。当创建 animal
实例调用 speak
方法时,沿着 Animal
的原型链找到 Animal.prototype.speak
方法并执行。而创建 dog
实例调用 speak
方法时,先在 dog
自身找到了重写的 speak
方法,就不会再沿着原型链去查找 Animal.prototype.speak
方法,从而实现了多态。原型链保证了子类可以继承父类的方法,同时又允许子类通过重写方法来改变行为,这就是原型链对多态实现过程的影响。
3. 在子类方法中调用 super
方法对多态性实现的作用和影响
在 ES6 类的继承中,可以在子类方法中使用 super
关键字来调用父类的同名方法。这对多态性实现有以下作用和影响:
- 作用:允许在子类方法中复用父类方法的部分逻辑,同时添加子类特有的逻辑,增强代码的复用性。例如,子类可能需要在父类方法执行的基础上进行一些额外操作。
- 影响:调用
super
方法不会改变多态性的本质,依然是根据对象的实际类型来决定调用哪个方法。但super
方法的调用使得子类方法可以结合父类方法的行为,而不仅仅是完全覆盖。
例如:
class Animal {
speak() {
console.log('I am an animal');
}
}
class Dog extends Animal {
speak() {
super.speak();
console.log('I am a dog, woof!');
}
}
let dog = new Dog();
dog.speak();
// 输出:
// I am an animal
// I am a dog, woof!
在上述代码中,Dog
子类的 speak
方法通过 super.speak()
调用了父类 Animal
的 speak
方法,然后又添加了自己特有的输出。这既保留了父类方法的行为,又增加了子类的特性,进一步丰富了多态的表现形式。