理解prototype与__proto__:深入探索对象的继承特性
2024-02-15 06:39:50
傻傻分不清的prototype与__proto__
在JavaScript中,prototype和__proto__都是与对象继承和原型链相关的概念,乍一看很容易混淆。但实际上,这两个概念有着本质的区别。
prototype
prototype是一个指向对象的构造函数的指针,它存储着对象的公共属性和方法。当我们创建一个新的对象时,JavaScript引擎会创建一个新的对象,并将该对象的__proto__属性指向其构造函数的prototype属性。这意味着,所有通过该构造函数创建的对象都能够访问和使用该构造函数prototype属性中定义的属性和方法。
例如,以下代码创建一个名为Person的构造函数:
function Person(name) {
this.name = name;
}
Person构造函数的prototype属性是一个对象,它定义了两个属性:name和age。
Person.prototype = {
name: null,
age: null
};
现在,我们可以使用Person构造函数创建一个新的对象:
const person = new Person('John');
person对象拥有一个name属性,它的值是'John'。此外,person对象还可以访问Person.prototype属性中定义的age属性,即使age属性没有在person对象中显式定义。
console.log(person.name); // 'John'
console.log(person.age); // null
proto
__proto__属性指向对象的原型对象,它是对象的直接父对象。当我们访问一个对象的属性或方法时,JavaScript引擎首先会检查该对象本身是否有该属性或方法。如果没有,则会沿着原型链向上查找,直到找到该属性或方法为止。
例如,在上面的例子中,person对象的__proto__属性指向Person.prototype对象。这意味着,person对象可以访问Person.prototype对象中定义的属性和方法,即使这些属性和方法没有在person对象中显式定义。
console.log(person.__proto__ === Person.prototype); // true
console.log(person.__proto__.name); // 'John'
console.log(person.__proto__.age); // null
区别
prototype和__proto__的主要区别在于:prototype是一个指向对象的构造函数的指针,而__proto__属性指向对象的原型对象。此外,prototype是构造函数的一个属性,而__proto__属性是对象的属性。
总结
prototype和__proto__都是与对象继承和原型链相关的概念,但它们具有不同的含义和用途。理解这两个概念的区别对于深入理解JavaScript中的对象模型至关重要。