158

我厌倦了总是不得不编写这样的代码:

function shallowExtend(obj1,obj2){
  var key;
  for ( key in obj2 ) {
    if ( obj2.hasOwnProperty(key) === false )  continue;
    obj1[key] = obj2[key]
  }
}

或者,如果我不想自己编写代码,请实现一个已经完成的库。ES6+ 肯定会在这方面提供帮助,为我们提供类似Object.prototype.extend(obj2...)Object.extend(obj1,obj2...)

那么 ES6+ 是否提供了这样的功能呢?如果还没有,那么是否计划了这样的功能?如果没有计划,那为什么不呢?

4

6 回答 6

215

您将能够使用 Object.assign 在 ES6 中进行浅合并/扩展/分配:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

句法:

Object.assign(目标来源);

其中...sources表示源对象。

例子:

var obj1 = {name: 'Daisy', age: 30};
var obj2 = {name: 'Casey'};

Object.assign(obj1, obj2);

console.log(obj1.name === 'Casey' && obj1.age === 30);
// true
于 2014-09-16T20:25:29.013 回答
180

您可以为此使用对象扩展语法

const merged = {...obj1, ...obj2}

对于数组,扩展运算符已经是 ES6 (ES2015) 的一部分,但对于对象,它被添加到 ES9 (ES2018) 的语言规范中。早在此之前,它的提议就在 Babel 等工具中默认启用。

于 2015-09-03T09:54:57.700 回答
16

我知道这是一个老问题,但 ES2015/ES6 中最简单的解决方案实际上非常简单,使用 Object.assign(),

希望这会有所帮助,这也可以进行DEEP合并:

/**
 * Simple is object check.
 * @param item
 * @returns {boolean}
 */
export function isObject(item) {
  return (item && typeof item === 'object' && !Array.isArray(item) && item !== null);
}

/**
 * Deep merge two objects.
 * @param target
 * @param source
 */
export function mergeDeep(target, source) {
  if (isObject(target) && isObject(source)) {
    for (const key in source) {
      if (isObject(source[key])) {
        if (!target[key]) Object.assign(target, { [key]: {} });
        mergeDeep(target[key], source[key]);
      } else {
        Object.assign(target, { [key]: source[key] });
      }
    }
  }
  return target;
}

示例用法:

mergeDeep(this, { a: { b: { c: 123 } } });
// or
const merged = mergeDeep({a: 1}, { b : { c: { d: { e: 12345}}}});  
console.dir(merged); // { a: 1, b: { c: { d: [Object] } } }
于 2016-01-12T17:29:51.770 回答
9

ES6

Object.assign(o1,o2) ; 
Object.assign({},o1,o2) ; //safe inheritance
var copy=Object.assign({},o1); // clone o1
//------Transform array of objects to one object---
var subjects_assess=[{maths:92},{phy:75},{sport:99}];
Object.assign(...subjects_assess); // {maths:92,phy:75,sport:99}

ES7 或通天塔

{...o1,...o2} // inheritance
 var copy= {...o1};
于 2016-08-16T22:34:54.573 回答
7

目前Object.mixin正在讨论添加以处理您要求的行为。https://mail.mozilla.org/pipermail/es-discuss/2012-December/027037.html

虽然它还没有出现在 ES6 草案中,但似乎有很多支持,所以我认为它很快就会出现在草案中。

于 2012-12-14T16:50:04.823 回答
5

也许 ES5Object.defineProperties方法可以完成这项工作?

例如

var a = {name:'fred'};
var b = {age: {value: 37, writeable: true}};

Object.defineProperties(a, b);

alert(a.age); // 37

MDN 文档:https ://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperties

于 2012-12-13T05:15:57.170 回答