更新对象的新引用后更新__proto__属性

时间:2016-08-19 23:11:50

标签: javascript

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__

那么,为什么?

1 个答案:

答案 0 :(得分:2)

原型背后的想法是由给定构造函数创建的所有实例(这意味着给定类的所有实例,如果您使用的是ES6类)共享一个原型对象。它只是一个存在且可以修改的单个对象:每次创建一个新实例时都不会创建一个新的原型对象,因为关键是它是共享的。

这两行是等价的;虽然第二种是这样做的首选方式*。

animal["__proto__"].foo = "foo";
Animal.prototype.foo = "foo";

如果你试图设置一个id,这个实例应该是唯一的,那么只需将它设置在对象本身上,而不是原型上。

* __proto__甚至被标准化为ES6语言的一部分;然后才因为所有的浏览器都实现了它