面试题答案
一键面试原型链支撑函数继承机制原理
在JavaScript中,每个函数都有一个prototype
属性,这个属性指向一个对象,称为原型对象。当函数被用作构造函数创建实例时,实例对象内部会有一个指向构造函数原型对象的[[Prototype]]
(在现代JavaScript中可以通过__proto__
属性访问,但不推荐使用)。当访问实例对象的属性或方法时,如果实例对象自身没有该属性或方法,JavaScript引擎会沿着[[Prototype]]
链向上查找,直到找到该属性或方法或者到达原型链顶端(null
)。
函数继承就是基于这种原型链查找机制。通过将子类的原型对象设置为父类的实例,这样子类的实例在查找属性和方法时,就会沿着这条原型链找到父类的属性和方法,从而实现继承。
代码示例
// 定义父类构造函数
function Animal(name) {
this.name = name;
}
// 给父类原型添加方法
Animal.prototype.speak = function() {
console.log(this.name + ' makes a sound.');
};
// 定义子类构造函数
function Dog(name, breed) {
// 调用父类构造函数初始化name属性
Animal.call(this, name);
this.breed = breed;
}
// 设置子类的原型为父类的实例,实现继承
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog; // 修正构造函数指向
// 创建Dog实例
const myDog = new Dog('Buddy', 'Golden Retriever');
myDog.speak(); // 输出: Buddy makes a sound.
console.log(myDog.breed); // 输出: Golden Retriever
在上述代码中,Dog
通过设置其原型为Animal
的实例,从而继承了Animal
的speak
方法。同时在Dog
构造函数中通过Animal.call(this, name)
调用父类构造函数来初始化name
属性。