说我有一个像这样的对象:
const obj1 = {foo:'bar'};
然后创建一个“副本”,(obj1
现在是obj2
的 proto ):
const obj2 = Object.create(obj1);
如果我打电话
obj2.foo = 3;
或
obj2.x = {};
我的问题是-obj1
会被写入还是永远不会被写入?据我所知,只有顶层对象会被写入-原型对象永远不会被修改。
换句话说,在任何情况下我都可以将属性obj2设置为obj1吗?
答案 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
本身上创建/更改属性。