【问题标题】:Confusion regarding the setting the property of a parent object from child object in javascript [duplicate]关于在javascript中从子对象设置父对象属性的困惑[重复]
【发布时间】: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 行之后看到的那样,输出为真。这也让我感到困惑。

【问题讨论】:

标签: javascript


【解决方案1】:

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

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

在第二个示例中,您从不直接写信给obj2,因此obj2 仍然是“空的”(您可以按照评论中的建议在每个示例之后使用obj2.hasOwnProperty('prop') 来检查)

【讨论】:

  • 但是在我设置 obj2.prop=2 之前添加这一行 obj2.hasOwnProperty('prop');在第一种情况下,我得到 false 作为 answer 。但是这意味着那个时候 obj2 中不存在 prop 吗??
  • 哎呀,我误解了这个问题。你完全正确,我完全编辑了答案以纠正这个错误。
  • @KiranYallabandi 您可能会发现 this 快速介绍 JavaScript 原型继承很有用。
  • @Clement Prevost 感谢您的澄清。目前我指的是“你不知道 JS”系列书籍,其中提到每当发生对象查找时使用 [[get]] 并使用 [[put]] 进行对象分配。你能不能给我一个链接到一个用这些术语解释我的问题的解决方案的网站??
  • 嗯,这是一个非常具体的要求,但我不知道命名这些操作的标准化方式,所以不幸的是你必须适应作者的偏好。
猜你喜欢
  • 1970-01-01
  • 2019-07-20
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 1970-01-01
  • 2020-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多