面试题答案
一键面试原型(prototype)概念
在JavaScript中,每一个函数对象都有一个prototype
属性,这个属性是一个对象,它包含了可以由特定类型的所有实例共享的属性和方法。当使用构造函数创建一个新对象时,新对象会通过内部的[[Prototype]]
(在现代JavaScript中可以通过__proto__
属性访问,但不推荐使用,更推荐使用Object.getPrototypeOf()
)链接到构造函数的prototype
对象。这意味着新对象可以访问构造函数prototype
对象上的属性和方法。
原型链概念
原型链是JavaScript实现继承的一种机制。当访问一个对象的属性或方法时,如果该对象本身没有这个属性或方法,JavaScript会沿着[[Prototype]]
链向上查找,直到找到该属性或方法,或者到达原型链的顶端(Object.prototype
,它的[[Prototype]]
为null
)。如果在整个原型链上都没有找到,则返回undefined
。
通过原型实现继承的示例
// 定义一个父构造函数
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的原型为Animal的实例,实现继承
Dog.prototype = Object.create(Animal.prototype);
// 修复Dog.prototype.constructor,使其指向Dog构造函数
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
的继承。这样Dog
的实例就可以访问Animal.prototype
上定义的speak
方法。