返回
__proto__和prototype:JavaScript原型链详解
前端
2023-12-07 12:29:58
__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是函数的属性,指向该函数创建的对象的原型对象。原型链是指从一个对象到原型对象,再到原型对象的原型对象,依次向上追溯的链条。原型链用于查找对象的属性和方法。