MST

星途 面试题库

面试题:JavaScript 中原型链与继承的基本理解

请阐述 JavaScript 中原型(prototype)和原型链的概念,并举例说明如何通过原型实现继承。
42.8万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

原型(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方法。