面试题答案
一键面试- 对象的原型(prototype):
- 在JavaScript中,每个函数都有一个
prototype
属性,这个属性是一个对象,它包含了可以由特定类型的所有实例共享的属性和方法。当使用构造函数创建一个新对象时,新对象会通过__proto__
属性(在ES6之前,现代浏览器也支持此属性)链接到构造函数的prototype
对象。
- 在JavaScript中,每个函数都有一个
- 原型链:
- 当访问一个对象的属性或方法时,如果该对象本身没有这个属性或方法,JavaScript会沿着
__proto__
链向上查找,直到找到该属性或方法,或者到达原型链的顶端(null
)。这种通过__proto__
链接起来的链条就称为原型链。
- 当访问一个对象的属性或方法时,如果该对象本身没有这个属性或方法,JavaScript会沿着
- 通过原型链实现继承的示例:
// 创建Animal构造函数
function Animal(name) {
this.name = name;
}
Animal.prototype.speak = function () {
console.log(this.name +'makes a sound.');
};
// 创建Dog构造函数,使其继承自Animal
function Dog(name, breed) {
// 调用Animal构造函数,设置name属性
Animal.call(this, name);
this.breed = breed;
}
// 设置Dog的原型为Animal的实例,实现继承
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
// 创建Dog的实例
const myDog = new Dog('Buddy', 'Golden Retriever');
// 在Dog实例中访问Animal的属性和方法
myDog.speak(); // 输出: Buddy makes a sound.
console.log(myDog.name); // 输出: Buddy
console.log(myDog.breed); // 输出: Golden Retriever
在上述代码中:
- 首先定义了
Animal
构造函数,它有一个name
属性和speak
方法在其原型上。 - 然后定义
Dog
构造函数,通过Animal.call(this, name)
调用Animal
构造函数来设置name
属性。 - 通过
Dog.prototype = Object.create(Animal.prototype)
将Dog
的原型设置为Animal
原型的一个实例,实现了继承。 - 最后修正
Dog.prototype.constructor
为Dog
,因为设置原型后构造函数会指向Animal
。 - 创建
myDog
实例后,可以访问Animal
的属性和方法,也能访问Dog
自身定义的属性。