返回

扩展视野,JS原型链的玄妙之旅:从类型到对象

前端

原型链是JavaScript中最核心的概念之一,它定义了对象的行为和属性的继承关系。通过原型链,你可以轻松创建复杂的对象结构,并灵活地修改它们的属性和方法。

原型链的核心是[[Prototype]]属性,它是一个指向另一个对象的指针。这个指向的对象被称为原型对象,它包含了该对象的所有属性和方法。当一个对象试图访问一个它不具有的属性或方法时,JavaScript就会沿着原型链向上查找,直到找到具有该属性或方法的原型对象。

例如,以下代码创建了一个名为“person”的对象:

const person = {
  name: "John Doe",
  age: 30
};

这个对象具有两个属性:“name”和“age”。如果我们尝试访问另一个属性,例如“city”,JavaScript会沿着原型链向上查找,直到找到具有该属性的原型对象。

在JavaScript中,所有对象都具有一个默认的原型对象,称为“Object.prototype”。这个对象包含了一些基本的方法,例如“toString()”和“valueOf()”。

如果你想创建一个自定义的原型对象,可以使用“Object.create()”方法。例如,以下代码创建了一个名为“employee”的原型对象:

const employee = Object.create(Object.prototype);

这个原型对象不具有任何属性或方法。如果你想向原型对象添加属性或方法,可以使用“defineProperty()”方法。例如,以下代码向“employee”原型对象添加一个名为“salary”的属性:

Object.defineProperty(employee, "salary", {
  value: 50000,
  writable: true,
  configurable: true
});

现在,你可以使用“employee”原型对象来创建“employee”对象。例如,以下代码创建了一个名为“john”的“employee”对象:

const john = Object.create(employee);

这个对象具有一个属性:“name”,它继承自“employee”原型对象。它还具有一个属性:“salary”,它被直接添加到“john”对象。

原型链是一个非常强大的工具,它可以让你创建复杂的对象结构,并灵活地修改它们的属性和方法。如果你想成为一名优秀的JavaScript开发者,那么你必须掌握原型链的概念。

下面是一些代码示例,可以帮助你更好地理解原型链:

// 创建一个名为“person”的对象
const person = {
  name: "John Doe",
  age: 30
};

// 访问“person”对象的“name”属性
console.log(person.name); // "John Doe"

// 访问“person”对象的“age”属性
console.log(person.age); // 30

// 试图访问“person”对象的“city”属性
console.log(person.city); // undefined

// 沿着原型链向上查找“city”属性
console.log(person.__proto__.city); // undefined

// 沿着原型链向上查找“toString()”方法
console.log(person.__proto__.__proto__.toString()); // "[object Object]"

// 创建一个自定义的原型对象
const employee = Object.create(Object.prototype);

// 向“employee”原型对象添加一个名为“salary”的属性
Object.defineProperty(employee, "salary", {
  value: 50000,
  writable: true,
  configurable: true
});

// 创建一个名为“john”的“employee”对象
const john = Object.create(employee);

// 访问“john”对象的“name”属性
console.log(john.name); // undefined

// 沿着原型链向上查找“name”属性
console.log(john.__proto__.name); // "John Doe"

// 访问“john”对象的“salary”属性
console.log(john.salary); // 50000