MST

星途 面试题库

面试题:JavaScript中原型链与函数继承:简述原型链与继承的关系

请简要阐述JavaScript中原型链是如何支撑函数继承机制的,并举一个简单的代码示例说明。
33.4万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

原型链支撑函数继承机制原理

在JavaScript中,每个函数都有一个prototype属性,这个属性指向一个对象,称为原型对象。当函数被用作构造函数创建实例时,实例对象内部会有一个指向构造函数原型对象的[[Prototype]](在现代JavaScript中可以通过__proto__属性访问,但不推荐使用)。当访问实例对象的属性或方法时,如果实例对象自身没有该属性或方法,JavaScript引擎会沿着[[Prototype]]链向上查找,直到找到该属性或方法或者到达原型链顶端(null)。

函数继承就是基于这种原型链查找机制。通过将子类的原型对象设置为父类的实例,这样子类的实例在查找属性和方法时,就会沿着这条原型链找到父类的属性和方法,从而实现继承。

代码示例

// 定义父类构造函数
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.prototype = Object.create(Animal.prototype);
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的实例,从而继承了Animalspeak方法。同时在Dog构造函数中通过Animal.call(this, name)调用父类构造函数来初始化name属性。