ES5的Object.assign等效方法

31

我想使用Object.assign来完成一些非常直观的操作。

var firstObj = {name : "Saba H.", rollNo : 1};
var secondObj = {college : "WCE"};
var wholeObj = Object.assign(firstObj, secondObj);

console.log(wholeObj); // {name : "Saba H.", rollNo : 1, college : "WCE"}

由于 Object.assign 是 ECMAScript6 harmony 提案的一部分,并且不受许多浏览器的支持,是否可以使用 ES5 完成?如果不能,则是否有任何微型程序库可用?


2
基于相同的--https://lodash.com/docs#assign,根据编辑,请查看lodash源代码,为什么不呢? - Cristian Cavalli
2
mdn中,您可以看到polyfill。 - Grundy
5个回答

43
在 underscore.js 中,你可以像这样使用:
_.extend(firstObj, secondObj);
在jQuery中,您可以使用:
$.extend({},firstObj,secondObj);

在纯JavaScript中,您可以使用此函数合并n个对象:

function mergeObjects() {
    var resObj = {};
    for(var i=0; i < arguments.length; i += 1) {
         var obj = arguments[i],
             keys = Object.keys(obj);
         for(var j=0; j < keys.length; j += 1) {
             resObj[keys[j]] = obj[keys[j]];
         }
    }
    return resObj;
}

7

我在MDN上找到了一个可用的Object.assign polyfill(太棒了,谢谢!):

if (typeof Object.assign != 'function') {
  // Must be writable: true, enumerable: false, configurable: true
  Object.defineProperty(Object, "assign", {
    value: function assign(target, varArgs) { // .length of function is 2
      'use strict';
      if (target == null) { // TypeError if undefined or null
        throw new TypeError('Cannot convert undefined or null to object');
      }

      var to = Object(target);

      for (var index = 1; index < arguments.length; index++) {
        var nextSource = arguments[index];

        if (nextSource != null) { // Skip over if undefined or null
          for (var nextKey in nextSource) {
            // Avoid bugs when hasOwnProperty is shadowed
            if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
              to[nextKey] = nextSource[nextKey];
            }
          }
        }
      }
      return to;
    },
    writable: true,
    configurable: true
  });
}

5

纯JavaScript实现方法:

function mergeObjects() {
  var res = {};
  for (var i = 0; i < arguments.length; i++)
    for (var x in arguments[i])
      res[x] = arguments[i][x];
  return res;
}

例子:

var my_merged_object = mergeObjects(obj1,obj2,...);

1
你忘记在循环内部声明 x 了。否则,它将成为全局变量。 - Maciej Bukowski
第二个for循环中也缺少hasOwnProperty检查 - René Baudisch

1
var extend = function ( defaults, options ) {
    var extended = {};
    var prop;
    for (prop in defaults) {
        if (Object.prototype.hasOwnProperty.call(defaults, prop)) {
            extended[prop] = defaults[prop];
        }
    }
    for (prop in options) {
        if (Object.prototype.hasOwnProperty.call(options, prop)) {
            extended[prop] = options[prop];
        }
    }
    return extended;
};

var settings = extend(defaults, options);

-3
使用展开运算符
var firstObj = {name : "Saba H.", rollNo : 1},
secondObj = {college : "WCE"},
wholeObj = {...firstObj, ...secondObj};

console.log(wholeObj); // {name : "Saba H.", rollNo : 1, college : "WCE"}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接