返回

深入浅出理解原型链,揭开 JavaScript 继承的神秘面纱

前端

JavaScript 作为一门灵活且强大的编程语言,其继承机制往往令人望而生畏。不过,通过深入了解原型链的概念,我们就能揭开 JavaScript 继承的神秘面纱,获得对这门语言更深入的理解。

原型链的本质

原型链是一种机制,用于对象之间的继承关系。它是一条指向对象及其原型对象的链接列表。每个对象都有一个内部属性 __proto__,指向其直接原型。原型对象又可以有自己的原型,如此递归下去,直到最终指向 null

原型对象的的作用

原型对象是用来定义对象的共有属性和方法的。当一个对象访问不存在的属性或方法时,JavaScript 会沿着原型链向上查找,直到找到该属性或方法。这意味着,所有继承自相同原型的对象都将共享这些共有属性和方法。

实例的创建

当创建一个新实例(即对象)时,它会从其构造函数的原型对象中继承属性和方法。换句话说,实例的 __proto__ 属性指向构造函数的原型对象。例如:

function Person(name) {
  this.name = name;
}

const person1 = new Person('John Doe');

在这里,person1__proto__ 属性指向 Person.prototype 对象,该对象包含所有 Person 实例共享的属性和方法。

理解继承

原型链的真正力量在于它允许对象继承自其原型对象。这意味着,子类可以访问并修改父类的属性和方法,从而实现代码重用和多态性。例如:

function Employee(name, salary) {
  Person.call(this, name);
  this.salary = salary;
}

Employee.prototype = Object.create(Person.prototype);

Employee 函数继承自 Person 函数,通过设置 Employee.prototype 等于 Person.prototype 的一个新对象来实现。这使得 Employee 实例可以访问 Person 原型对象中的属性和方法,同时还定义了 salary 属性。

自定义原型链

虽然原型链通常是由 JavaScript 引擎自动管理的,但我们也可以手动创建和修改原型链。例如,我们可以为 Person 原型对象添加一个新方法:

Person.prototype.greet = function() {
  console.log(`Hello, my name is ${this.name}`);
};

现在,所有 Person 实例都可以访问 greet 方法,因为它位于它们的原型链中。