返回

JS 原型链中的 prototype 和 __proto__ 属性:相似之处和区别

前端

在 JavaScript 中,prototype 和 proto 是两个密切相关的属性,它们都与对象的原型链有关。 prototype 属性用于访问对象的原型对象,而 proto 属性用于访问对象的隐式原型对象。

prototype 属性

对象的 prototype 属性指向它的原型对象。原型对象是一个普通的 JavaScript 对象,它包含了一组属性和方法,这些属性和方法可以被该对象的所有实例继承。

例如,以下代码创建了一个名为 Person 的类,它包含一个名为 name 的属性和一个名为 greet() 的方法:

class Person {
  constructor(name) {
    this.name = name;
  }

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

我们可以使用 Person 类的 prototype 属性来访问它的原型对象:

const personPrototype = Person.prototype;

console.log(personPrototype);

这将输出以下内容:

Person {}

personPrototype 对象包含了一组属性和方法,这些属性和方法可以被 Person 类的所有实例继承。例如,我们可以使用 personPrototype.name 属性来访问 Person 类的 name 属性:

console.log(personPrototype.name); // undefined

这是因为 name 属性是实例属性,而不是原型属性。原型属性是那些在原型对象中定义的属性,而实例属性是那些在实例对象中定义的属性。

proto 属性

对象的 proto 属性指向它的隐式原型对象。隐式原型对象是一个特殊的 JavaScript 对象,它包含了一组属性和方法,这些属性和方法可以被该对象的所有实例继承。

proto 属性与 prototype 属性非常相似,但它们之间有一个关键的区别。prototype 属性是显式的,这意味着它可以在代码中直接访问,而 proto 属性是隐式的,这意味着它只能通过间接方式访问。

例如,我们可以使用 Object.getPrototypeOf() 方法来访问对象的 proto 属性:

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

const personProto = Object.getPrototypeOf(person);

console.log(personProto);

这将输出以下内容:

Person {}

personProto 对象与 personPrototype 对象是相同的。这是因为 Person 类的隐式原型对象就是 Person 类的原型对象。

prototype 和 proto 属性的区别

prototype 和 proto 属性都是用于访问和操作原型链的属性,但它们之间有一些区别。

  • prototype 属性用于访问对象的原型对象,而 proto 属性用于访问对象的隐式原型对象。
  • prototype 属性是显式的,这意味着它可以在代码中直接访问,而 proto 属性是隐式的,这意味着它只能通过间接方式访问。
  • prototype 属性只能用于访问对象的原型对象,而 proto 属性可以用于访问对象的原型对象和隐式原型对象。

总结

prototype 和 proto 属性都是 JavaScript 中非常重要的属性,它们可以帮助我们理解和操作对象的原型链。 prototype 属性用于访问对象的原型对象,而 proto 属性用于访问对象的隐式原型对象。prototype 属性是显式的,这意味着它可以在代码中直接访问,而 proto 属性是隐式的,这意味着它只能通过间接方式访问。prototype 属性只能用于访问对象的原型对象,而 proto 属性可以用于访问对象的原型对象和隐式原型对象。