返回

原型解密:揭开 JavaScript 原型继承的面纱

前端

原型是什么?

原型是 JavaScript 中的一种特殊对象,它定义了所有实例对象的公共属性和方法。当创建实例对象时,JavaScript 会在该实例上创建一个指向其原型对象的隐式引用。这意味着实例对象可以访问并继承原型对象的所有属性和方法。

原型对象本身也是一个对象,它可以有自己的属性和方法,并且也可以拥有自己的原型对象,如此逐级向上,就形成了一条称为原型链的链条。原型链使得JavaScript具有了继承的特性,允许子对象从父对象继承属性和方法。

原型继承如何工作?

原型继承是一种通过原型链实现的继承机制。当您使用 new 调用一个构造函数来创建实例对象时,JavaScript 会自动创建一个指向该构造函数原型的隐式引用,并将该引用存储在实例对象的 __proto__ 属性中。这意味着实例对象可以访问并继承原型对象的所有属性和方法。

例如,以下代码创建了一个构造函数 Person,该构造函数具有 nameage 两个属性,以及一个 speak() 方法:

function Person(name, age) {
  this.name = name;
  this.age = age;
  this.speak = function() {
    console.log("My name is " + this.name + " and I am " + this.age + " years old.");
  };
}

现在,让我们使用这个构造函数创建一个实例对象:

const person1 = new Person("John Doe", 30);

如果我们访问 person1 对象的 __proto__ 属性,我们会发现它指向 Person 构造函数的原型对象:

console.log(person1.__proto__); // Person {}

这意味着 person1 对象可以访问并继承 Person 构造函数原型对象的所有属性和方法。例如,我们可以调用 person1 对象的 speak() 方法:

person1.speak(); // My name is John Doe and I am 30 years old.

原型链是什么?

原型链是一条由原型对象组成的链条,它允许实例对象访问并继承其原型对象的所有属性和方法。原型链的顶端是 Object 构造函数的原型对象,所有其他对象的原型对象都直接或间接地继承自它。

当JavaScript引擎试图访问一个实例对象某个不存在的属性时,它会沿着原型链向上查找,直到找到该属性。如果在整个原型链中都找不到该属性,则会返回 undefined

原型链使得JavaScript具有了继承的特性,允许子对象从父对象继承属性和方法。子对象可以访问并继承父对象的所有属性和方法,而父对象无法访问和继承子对象的属性和方法。

总结

原型是 JavaScript 中的核心概念之一,原型继承和原型链对于理解 JavaScript 的对象模型及其继承机制至关重要。原型继承允许子对象从父对象继承属性和方法,而原型链则允许实例对象访问并继承其原型对象的所有属性和方法。掌握原型继承和原型链的概念对于编写健壮、可扩展的 JavaScript 代码至关重要。