在 JavaScript 中,实例对象可以读写原型对象的成员。原型对象是一个对象,用于存储共享的属性和方法,它是通过构造函数创建的实例对象的共享属性和方法的来源。
你可以通过以下几种方式来读写原型对象的成员:
-
通过实例对象的
__proto__
属性来读取原型对象的成员。__proto__
属性指向实例对象的原型对象。function Person(name) { this.name = name; } Person.prototype.age = 20; var person = new Person("John"); console.log(person.__proto__.age); // 输出 20
-
通过
Object.getPrototypeOf()
方法来获取实例对象的原型对象,并读取原型对象的成员。function Person(name) { this.name = name; } Person.prototype.age = 20; var person = new Person("John"); var proto = Object.getPrototypeOf(person); console.log(proto.age); // 输出 20
-
直接通过实例对象来访问原型对象的成员。实例对象会首先在自身的属性中查找,如果找不到,就会继续在原型对象中查找。
function Person(name) { this.name = name; } Person.prototype.age = 20; var person = new Person("John"); console.log(person.age); // 输出 20
对于写入原型对象的成员,如果实例对象中已经存在同名的属性,则会覆盖原型对象中的成员。如果实例对象中不存在同名的属性,则会在实例对象中创建一个新的属性。
function Person(name) {
this.name = name;
}
Person.prototype.age = 20;
var person = new Person("John");
console.log(person.age); // 输出 20
person.age = 25;
console.log(person.age); // 输出 25
console.log(Person.prototype.age); // 输出 20
上述代码中,当我们将person.age
赋值为25时,实际上是在实例对象中创建了一个名为age
的新属性,覆盖了原型对象中的age
属性。此时,person.age
与Person.prototype.age
是不同的值。
总结:
- 实例对象可以通过
__proto__
属性、Object.getPrototypeOf()
方法和直接访问属性的方式读取原型对象的成员。 - 如果实例对象中已经存在同名的属性,写入操作会覆盖原型对象中的成员,如果不存在同名的属性,写入操作会创建一个新的属性。