MST

星途 面试题库

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

请描述JavaScript中对象的原型(prototype)与原型链的概念,并举例说明如何通过原型链实现继承。例如,创建一个`Animal`构造函数和`Dog`构造函数,`Dog`继承自`Animal`,并展示如何在`Dog`实例中访问`Animal`的属性和方法。
47.6万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
  1. 对象的原型(prototype)
    • 在JavaScript中,每个函数都有一个prototype属性,这个属性是一个对象,它包含了可以由特定类型的所有实例共享的属性和方法。当使用构造函数创建一个新对象时,新对象会通过__proto__属性(在ES6之前,现代浏览器也支持此属性)链接到构造函数的prototype对象。
  2. 原型链
    • 当访问一个对象的属性或方法时,如果该对象本身没有这个属性或方法,JavaScript会沿着__proto__链向上查找,直到找到该属性或方法,或者到达原型链的顶端(null)。这种通过__proto__链接起来的链条就称为原型链。
  3. 通过原型链实现继承的示例
// 创建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.constructorDog,因为设置原型后构造函数会指向Animal
  • 创建myDog实例后,可以访问Animal的属性和方法,也能访问Dog自身定义的属性。