返回

揭秘原型对象:prototype 和 __proto__ 的本质区别

前端

原型对象:基础概念

在面向对象编程中,原型对象是一个特殊的对象,它为一组对象共享属性和方法。当创建一个新对象时,JavaScript 会自动创建一个与该对象关联的原型对象,并为其添加一些默认属性和方法。

构造函数的 prototype 属性

在 JavaScript 中,每个构造函数都具有一个 prototype 属性。该属性指向与该构造函数关联的原型对象。因此,我们可以通过构造函数的 prototype 属性来访问和修改原型对象。

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

// 为 Person 构造函数的 prototype 属性添加一个 sayHello 方法
Person.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
};

// 创建一个 Person 对象
const person1 = new Person('John', 30);

// 调用 Person 对象的 sayHello 方法
person1.sayHello(); // 输出: Hello, my name is John and I am 30 years old.

proto 属性

对象的 proto 属性指向其原型对象。因此,我们可以通过对象的 proto 属性来访问和修改原型对象。

const person1 = new Person('John', 30);

// 访问 Person 对象的 __proto__ 属性
console.log(person1.__proto__ === Person.prototype); // 输出: true

prototype 和 proto 的区别

虽然 prototype 和 proto 属性都与原型对象相关,但它们之间还是存在一些区别。

  • prototype 是构造函数的属性,而 proto 是对象的属性。
  • prototype 可以被修改,而 proto 通常是只读的。

总结

prototype 和 proto 属性都是 JavaScript 中原型对象的重要组成部分。通过理解这两个属性之间的区别,我们可以更深入地理解原型对象的运作机制,并在实际开发中更好地利用原型对象。