面试题答案
一键面试原理阐述
在JavaScript中,每个函数都有一个prototype
属性,这个属性是一个对象,它包含了可以被该函数创建的所有实例对象共享的属性和方法。当使用构造函数创建一个新对象时,新对象的内部会有一个[[Prototype]]
(在现代JavaScript中可以通过__proto__
访问,虽然__proto__
已不推荐使用但便于理解)指针,指向构造函数的prototype
对象。
继承的原理基于这样一个机制:当访问一个对象的属性或方法时,如果该对象本身没有这个属性或方法,JavaScript会沿着[[Prototype]]
链向上查找,直到找到该属性或方法,或者到达[[Prototype]]
链的顶端(null
)。通过设置子构造函数的prototype
为父构造函数的实例,就建立了一条[[Prototype]]
链,使得子对象可以访问父对象的属性和方法,从而实现继承。
代码实现步骤
- 定义父构造函数:
function Animal(name) {
this.name = name;
}
Animal.prototype.speak = function() {
console.log(this.name +'makes a sound.');
};
- 定义子构造函数:
function Dog(name, breed) {
// 调用父构造函数,确保父构造函数中的属性被正确初始化到子对象中
Animal.call(this, name);
this.breed = breed;
}
- 建立原型链:
// 创建一个Animal的实例作为Dog的prototype
Dog.prototype = Object.create(Animal.prototype);
// 修正Dog.prototype.constructor,使其指向Dog构造函数
Dog.prototype.constructor = Dog;
- 为子构造函数添加特有方法:
Dog.prototype.bark = function() {
console.log(this.name +'barks.');
};
- 使用:
const myDog = new Dog('Buddy', 'Golden Retriever');
myDog.speak(); // 输出: Buddy makes a sound.
myDog.bark(); // 输出: Buddy barks.