class Animal {
constructor() {
}
}
let animal = new Animal();
// first case
animal['__proto__']['__id'] = 1;
console.log(animal['__proto__']);
// second case
animal = new Animal();
console.log(animal['__proto__']);
我的问题:为什么__id
的第二个清除/删除属性__proto__
没有?
animal
,第二种情况下为animal
,引用同一类(对象)。但是在OOP中,当我重置对象的实例时,所有属性也将被重置。在这种情况下,它不适用于__proto__
。
那么,为什么?
答案 0 :(得分:2)
原型背后的想法是由给定构造函数创建的所有实例(这意味着给定类的所有实例,如果您使用的是ES6类)共享一个原型对象。它只是一个存在且可以修改的单个对象:每次创建一个新实例时都不会创建一个新的原型对象,因为关键是它是共享的。
这两行是等价的;虽然第二种是这样做的首选方式*。
animal["__proto__"].foo = "foo";
Animal.prototype.foo = "foo";
如果你试图设置一个id,这个实例应该是唯一的,那么只需将它设置在对象本身上,而不是原型上。
* __proto__
甚至被标准化为ES6语言的一部分;然后才因为所有的浏览器都实现了它