【发布时间】:2015-08-23 21:47:50
【问题描述】:
假设我们有一个这样的代码示例:
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,尽管子对象上的值正在更改。为什么这里没有发生可变阴影。换句话说,为什么不在obj2 上创建一个名为prop 的新属性,为什么在此处操作父对象(obj1)的prop?
编辑:如果我执行以下操作
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);
正如您在obj2.prop=2 行之后看到的那样,输出为真。这也让我感到困惑。
【问题讨论】:
-
您可能会发现The Resolution of Property Names on Objects 很有用。
标签: javascript