假设我们有这样的代码示例:
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);
之后看到输出为真。这也让我感到困惑。
答案 0 :(得分:2)
这是因为当您创建obj2
时,不会复制任何属性,但obj2
的原型会变为obj1
。这意味着在读取时,引擎在整个原型链中查找属性并在写入时,您只需写入对象。
当您执行obj2.prop = 2
时会发生什么事情是您直接写入obj2
但是当您执行obj2.prop.subProp = 2
时,您首先要求引擎读取obj2.prop
然后写入那个对象有些价值。
在第二个示例中,您永远不会直接写入obj2
,因此obj2
仍为“空”(您可以在评论中建议的每个示例后使用obj2.hasOwnProperty('prop')
进行检查)