【问题标题】:Shorthand for applying an entire object to another object?将整个对象应用于另一个对象的简写?
【发布时间】:2019-09-05 10:42:11
【问题描述】:

有没有这个的简写:

canvas.width = size.width;
canvas.height = size.height;

size 对象中没有其他键。

【问题讨论】:

  • 你想(基本上)克隆一个对象?
  • 我猜更像是 merge 而不是克隆,@VLAZ
  • @JordiNebot 是的,我知道有区别,但我不确定哪个是 OP 之后。

标签: javascript ecmascript-6 ecmascript-2016


【解决方案1】:

如果你想改变目标对象,你可以使用Object.assign

Object.assign(canvas, size);

或者,如果您希望合并到一个新对象中,您可以提供一个空目标。

var result = Object.assign({}, canvas, size);

或者使用 ES6 扩展运算符,但它只是上面的语法糖。

var result = { ...canvas, ...size };

【讨论】:

  • 最后一个是我一直在找的,但是不行,size代替了canvas,可能是因为canvas是一个html对象。 (document.getElementById)
  • 如果您只想将size 的内容合并到您现有的canvas 中,我建议您尝试第一个示例。使用两个非变异示例中的任何一个都不会将 prototype 复制到目标对象,如果 canvasHTMLElement 您可能希望保留 prototype
【解决方案2】:

只要canvas 被定义并且是一个对象,你就可以合并两个对象:

canvas = {...canvas, ...size}

【讨论】:

  • 仅供参考,这是针对较新版本的 js(来自 ES6)
  • 这是我寻找的,但是,它不起作用,大小替换画布,可能是因为canvas 是一个html对象。 (document.getElementById)
  • 查看@UncleDave 对Object.assign 的首次使用,因为展开运算符将创建一个新对象。
【解决方案3】:

对于不支持您可以使用的其他方法的旧浏览器:

function moveFields(from, to) {
    Object.keys(from).forEach(function(key) { to[key] = from[key] });
}

即使在 IE9 中也可以使用

【讨论】:

    【解决方案4】:

    至少,你可以把你的作业写成-

    `const canvas = { ...size };`
    

    一个测试沙盒是here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多