给定对象:

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框架的解决方案是否可行?


当前回答

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

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

其他回答

我宁愿使用firstObject作为secondObject的原型,并添加属性描述符:

var secondObject = Object.create(firstObject, {
      key3: {value: "value3", writable: true, configurable: true, enumerable: true},
      key4: {value: "value4", writable: true, configurable: true, enumerable: true}
      });

它当然不是一行程序,但它给了您更多的控制。如果您对属性描述符感兴趣,我建议阅读这篇文章:http://patrickdelancy.com/2012/09/property-descriptors-in-javascript/#comment-2062 和MDN页面https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create

你也可以只分配值,省略描述符,让它更短:

var secondObject = Object.create(firstObject, {
      key3: {value: "value3"}
      key4: {value: "value4"}
  });

兼容性:ECMAScript 5,即IE9+

for(var k in firstObject) secondObject[k]=firstObject[k];
var firstObject = {
     key1: "value1",
     key2: "value2"
};

var secondObject = {
     key3: "value3",
     key4: "value4"
     copy: function(firstObject){
           this.key1 = firstObject.key1;
           this.key2 = firstObject.key2;
     }
 };

使用以下方法将复制属性

secondObject.copy(firstObject)

我对javascript很陌生,但发现这个工作。我想时间有点长了,但很管用。

根据ES6 -扩展语法:

你可以简单地使用:

const thirdObject = {
   ...firstObject,
   ...secondObject   
}

这避免了通过引用传递这些对象的问题。

此外,它还负责具有深度嵌套的对象。

死灵,所以人们可以找到一个深度复制方法与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;
};