给定对象:

var firstObject = {
    key1 : 'value1',
    key2 : 'value2'
};

我如何复制属性在另一个对象(secondObject)像这样:

var secondObject = {
    key1 : 'value1',
    key2 : 'value2',
    key3 : 'value3',
    key4 : 'value4'
};

使用对firstObject的引用?就像这样:

var secondObject = {
    firstObject,
    key3 : 'value3',
    key4 : 'value4'
};

(这行不通……我把它放在大行中只是为了显示我想如何组织代码)。

不使用任何JavaScript框架的解决方案是否可行?


当前回答

死灵,所以人们可以找到一个深度复制方法与hasOwnProperty和实际对象检查:

var extend = function (original, context, key) {
  for (key in context)
    if (context.hasOwnProperty(key))
      if (Object.prototype.toString.call(context[key]) === '[object Object]')
        original[key] = extend(original[key] || {}, context[key]);
      else
        original[key] = context[key];
  return original;
};

其他回答

从@ bardzuievny的回答中得到启发,ES6提供了一个本地解决方案:Object.assign()函数!

用法很简单:

Object.assign(secondObject, firstObject);

就是这样!

目前的支持显然很差;只有Firefox(34+)可以开箱即用,而Chrome(45+)和Opera(32+)需要设置“实验性标志”。

支持正在改进,最新版本的Chrome、Firefox、Opera、Safari和Edge都支持它(显然IE不支持)。转译器也可用,如Babel和Traceur。请看这里了解更多细节。

遍历第一个对象的属性并将它们赋值给第二个对象,如下所示:

var firstObject = {
    key1 : 'value1',
    key2 : 'value2'
};

var secondObject = {
    key3 : 'value3',
    key4 : 'value4'
};

for (var prop in firstObject) {
    if (firstObject.hasOwnProperty(prop)) {
        secondObject[prop] = firstObject[prop];
    }
}

for-in循环是不够的;你需要hasOwnProperty。有关原因的详细解释,请参阅http://bonsaiden.github.com/JavaScript-Garden/#object.forinloop。

使用属性扩展符号。它是在ES2018中添加的(数组/可迭代对象的扩展是更早的ES2015), {…firstObject}将所有可枚举的属性展开为离散的属性。

let secondObject = {
      ...firstObject,
      key3 : 'value3',
      key4 : 'value4'
    }

声明一下,现在也可以用

var firstObject = {
    key1 : 'value1',
    key2 : 'value2'
};

var secondObject = {
    ...firstObject,
    key3 : 'value3',
    key4 : 'value4'
};
for(var k in firstObject) secondObject[k]=firstObject[k];