返回

__proto__和prototype:JavaScript原型链详解

前端

__proto__和prototype的区别

__proto__和prototype都是指向对象的原型对象的指针,但它们之间还是有一些区别的:

  • __proto__是对象的内部属性,只能通过Object.getPrototypeOf()方法来访问。prototype是函数的属性,可以通过函数名.prototype来访问。
  • __proto__指向该对象的原型对象。prototype指向该函数创建的对象的原型对象。
  • __proto__是只读属性,不能被修改。prototype是可写属性,可以被修改。

__proto__和prototype的联系

__proto__和prototype之间存在着密切的联系:

  • 一个对象的__proto__属性指向该对象的原型对象。
  • 一个函数的prototype属性指向该函数创建的对象的原型对象。
  • 一个对象的原型对象是另一个对象的__proto__属性指向的对象。

原型链

原型链是指从一个对象到原型对象,再到原型对象的原型对象,依次向上追溯的链条。原型链用于查找对象的属性和方法。

当我们访问一个对象的属性或方法时,JavaScript引擎会首先在该对象中查找。如果找不到,则会沿着原型链向上查找,直到找到该属性或方法。

举个例子

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

Person.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
};

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

person.sayHello(); // Hello, my name is John Doe and I am 30 years old.

console.log(person.__proto__ === Person.prototype); // true
console.log(Person.prototype.__proto__ === Object.prototype); // true

在这个例子中,person对象的__proto__属性指向Person.prototype对象。Person.prototype对象的__proto__属性指向Object.prototype对象。Object.prototype对象的__proto__属性指向null。

当我们调用person.sayHello()方法时,JavaScript引擎会首先在person对象中查找sayHello方法。找不到后,会沿着原型链向上查找,直到找到Person.prototype对象中的sayHello方法。

总结

__proto__和prototype是两个容易混淆的概念,但它们之间存在着密切的联系。__proto__是对象的内部属性,指向该对象的原型对象。prototype是函数的属性,指向该函数创建的对象的原型对象。原型链是指从一个对象到原型对象,再到原型对象的原型对象,依次向上追溯的链条。原型链用于查找对象的属性和方法。