写入__proto__对象

时间:2018-10-12 18:02:40

标签: javascript node.js

说我有一个像这样的对象:

const obj1 = {foo:'bar'};

然后创建一个“副本”,(obj1现在是obj2 proto ):

const obj2 = Object.create(obj1);

如果我打电话

obj2.foo = 3;

obj2.x = {};

我的问题是-obj1会被写入还是永远不会被写入?据我所知,只有顶层对象会被写入-原型对象永远不会被修改。

换句话说,在任何情况下我都可以将属性obj2设置为obj1吗?

2 个答案:

答案 0 :(得分:1)

如果

obj1可以像Object.getPrototypeOf(obj2).foo = 3这样直接访问,则可以写入,但是不太可能不是故意这样做的。

如果在设计时没有考虑继承的情况,就有可能故意写obj1,例如:

const obj1 = {
  get foo() { return obj1._foo },
  set foo(v) { obj1._foo = v}
}

const obj2 = Object.create(obj1);
obj2.foo = 3;

在对象方法内部直接引用对象而不是this是在旧版ES3 / ES5代码中维护适当上下文的一种常用方法。

答案 1 :(得分:1)

  

在任何情况下我都可以在属性obj2中设置属性obj1吗?

仅当obj1定义了obj2继承的setter属性(然后实际发生什么取决于setter的实现)。否则,obj2上的属性分配将始终在obj2本身上创建/更改属性。