MST

星途 面试题库

面试题:JavaScript 中如何通过 prototype 实现对象继承?请简述其原理及实现步骤

在 JavaScript 里,利用 prototype 实现对象继承是一种常见的方式。请详细阐述其背后的原理,并给出至少一种利用 prototype 实现继承的具体代码实现步骤。
37.7万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

原理阐述

在JavaScript中,每个函数都有一个prototype属性,这个属性是一个对象,它包含了可以被该函数创建的所有实例对象共享的属性和方法。当使用构造函数创建一个新对象时,新对象的内部会有一个[[Prototype]](在现代JavaScript中可以通过__proto__访问,虽然__proto__已不推荐使用但便于理解)指针,指向构造函数的prototype对象。

继承的原理基于这样一个机制:当访问一个对象的属性或方法时,如果该对象本身没有这个属性或方法,JavaScript会沿着[[Prototype]]链向上查找,直到找到该属性或方法,或者到达[[Prototype]]链的顶端(null)。通过设置子构造函数的prototype为父构造函数的实例,就建立了一条[[Prototype]]链,使得子对象可以访问父对象的属性和方法,从而实现继承。

代码实现步骤

  1. 定义父构造函数
function Animal(name) {
    this.name = name;
}
Animal.prototype.speak = function() {
    console.log(this.name +'makes a sound.');
};
  1. 定义子构造函数
function Dog(name, breed) {
    // 调用父构造函数,确保父构造函数中的属性被正确初始化到子对象中
    Animal.call(this, name);
    this.breed = breed;
}
  1. 建立原型链
// 创建一个Animal的实例作为Dog的prototype
Dog.prototype = Object.create(Animal.prototype);
// 修正Dog.prototype.constructor,使其指向Dog构造函数
Dog.prototype.constructor = Dog;
  1. 为子构造函数添加特有方法
Dog.prototype.bark = function() {
    console.log(this.name +'barks.');
};
  1. 使用
const myDog = new Dog('Buddy', 'Golden Retriever');
myDog.speak(); // 输出: Buddy makes a sound.
myDog.bark(); // 输出: Buddy barks.