扩展视野,JS原型链的玄妙之旅:从类型到对象
2024-01-01 00:03:13
原型链是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