返回

原型与原型链:了解JavaScript中的对象关系

前端

原型(prototype)

原型是JavaScript中一个特殊的对象,它是一个对象的模板,用于创建新的对象。当创建一个新对象时,JavaScript会创建一个该对象的原型对象,并将其链接到新对象的__proto__属性。

原型链(prototype chain)

原型链是指从一个对象到它的原型对象,再到原型对象的原型对象,以此类推,直到到达Object.prototype为止的一系列对象。JavaScript中的每个对象都有一个原型对象,除了Object.prototype之外。

proto

__proto__属性指向对象的原型对象,它是JavaScript内部的属性,但我们也可以直接访问它。通过__proto__属性,我们可以访问原型对象上的属性和方法。

prototype

prototype属性是函数的属性,它指向函数创建的对象的原型对象。换句话说,prototype属性指向函数的实例对象的原型对象。

constructor

constructor属性指向创建对象的函数。通过constructor属性,我们可以访问创建对象的函数本身。

理解原型和原型链

为了更好地理解原型和原型链,让我们举一个例子。假设我们有一个Person函数,它创建Person对象。Person函数的prototype属性指向Person对象的原型对象。Person对象的__proto__属性指向Person对象的原型对象。而Person对象的原型对象的__proto__属性指向Object.prototype。

我们可以使用以下代码来验证这一点:

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

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

const person1 = new Person('John');

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

console.log(person1.prototype); // undefined
console.log(Person.prototype); // Person {}
console.log(Person.prototype.constructor); // Function Person(name)

person1.greet(); // Hello, my name is John.

在这个例子中,person1.__proto__指向Person对象的原型对象,Person对象的原型对象的__proto__指向Object.prototype。person1.prototype为undefined,因为person1不是函数。Person.prototype指向Person对象的原型对象,Person.prototype.constructor指向Person函数本身。

总结

原型和原型链是JavaScript中重要的概念,理解它们有助于我们深入了解对象之间的关系,更好地进行编程。原型是对象的模板,用于创建新的对象。原型链是指从一个对象到它的原型对象,再到原型对象的原型对象,以此类推,直到到达Object.prototype为止的一系列对象。__proto__属性指向对象的原型对象,prototype属性指向函数创建的对象的原型对象,constructor属性指向创建对象的函数。