【问题标题】:prototypical inheritance in javascript ,cloning property [duplicate]javascript中的原型继承,克隆属性[重复]
【发布时间】:2019-11-18 21:53:54
【问题描述】:

如何在 javascript 中实现以下功能

var parent = {
  a: 5,
  b: 6
}

var child = parent;
console.log(child.b); // 6

//now if I change the value of b
parent.b = 7

console.log(parent.b); //7
console.log(child.b); //7

//但我想保留它现在不应该更改的对象属性的先前值。在 console.log(child.b) 的情况下它应该显示 6 而不是 7

https://codebunk.com/b/696347863/

【问题讨论】:

  • 您的代码与继承或原型无关。
  • @Lain - 这是复制对象的非常糟糕的方法。它在很多方面都失败了,并且完全没有必要通过 text.
  • @Ele - 根据 OP 所说的他们想要的(分配给 parent.b 不影响 child.b 的值),克隆对象而不是仅仅引用它是真正的问题。 OP提到的继承等,我认为,这是一个红鲱鱼。 (不确定我是否完全同意关闭,但我自己不同意不足以自行打开它,尤其是鉴于parent.b/child.b 的事情。:-)跨度>
  • @T.J.Crowder 我知道,但是当他/她只将一个对象分配给一个变量时,OP 对真正发生的事情缺乏了解。
  • @Ele - 是的,完全同意。

标签: javascript


【解决方案1】:

当您执行var child = parent 时,子对象和父对象都引用内存中的同一个对象实例。如果要将父对象的属性复制到子对象,则需要创建一个与父对象具有相同键的新对象。 您可以为此使用传播...object.assign

var parent = {
  a: 5,
  b: 6
}

var child = {...parent};
var child1 = Object.assign({}, parent);

console.log(child.b); // 6
console.log(child1.b); // 6

//now if I change the value of b
parent.b = 7

console.log(parent.b); //7
console.log(child.b); //6
console.log(child1.b); //6

对于深度克隆,我们需要使用其他替代方法,因为 Object.assign()... 复制属性值。如果源值是对对象的引用,则它只复制该引用值。

【讨论】:

  • 这不是完全克隆的方法,这只是传播对象的第一层。
  • @T.J.Crowder 我已删除该行。我不是在用这些术语说话。虽然是的,但如果你这样想,这听起来很令人困惑。
  • var child = {...parent}; SyntaxError: Unexpected token ... at createScript (vm.js:56:10) at Object.runInNewContext (vm.js:93:10)
  • @user3647491 编辑器给你这个错误,可能是编辑器不支持 ES6 语法,尽管它是完全有效的语法。如果有帮助,您可以使用Object.assign() 而不是...
猜你喜欢
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 2019-01-24
  • 2016-07-04
  • 2013-03-05
  • 2020-12-28
  • 2015-01-17
  • 1970-01-01
相关资源
最近更新 更多