关于在javascript中从子对象设置父对象的属性的困惑

时间:2015-08-23 21:47:51

标签: javascript

假设我们有这样的代码示例:

var obj1={ prop:1 };
var obj2=Object.create(obj1);
obj2.prop=2;
console.log(obj1.prop);

此处输出为1,因为在子对象obj2中,属性prop将被遮蔽。但是,当我这样做时:

var obj1={ prop:{subProp:1} };
var obj2=Object.create(obj1);
obj2.prop.subProp=2;
console.log(obj1.prop.subProp);

令人惊讶的是,尽管在子对象上更改了值,但我发现输出为2。为什么在这里不会发生变量阴影。换句话说,为什么在prop上创建了名为obj2的新属性,为什么父对象prop的{​​{1}}被操作?< / p>

编辑:如果我执行以下操作

obj1

此处输出将为false。但是:

var obj1={ prop:1 };
var obj2=Object.create(obj1);
var isPresent=obj2.hasOwnProperty('prop');
console.log(isPresent);

在这里,您可以在行var obj1={ prop:1 }; var obj2=Object.create(obj1); var isPresent=obj2.hasOwnProperty('prop'); console.log(isPresent); obj2.prop=2; isPresent=obj2.hasOwnProperty('prop'); console.log(isPresent); 之后看到输出为真。这也让我感到困惑。

1 个答案:

答案 0 :(得分:2)

这是因为当您创建obj2时,不会复制任何属性,但obj2的原型会变为obj1。这意味着在读取时,引擎在整个原型链中查找属性并在写入时,您只需写入对象。

当您执行obj2.prop = 2时会发生什么事情是您直接写入obj2但是当您执行obj2.prop.subProp = 2时,您首先要求引擎读取obj2.prop然后写入那个对象有些价值。

在第二个示例中,您永远不会直接写入obj2,因此obj2仍为“空”(您可以在评论中建议的每个示例后使用obj2.hasOwnProperty('prop')进行检查)