实现思路:支持es6的浏览器,可以直接用Object.assign()合并对象,只支持es5的浏览器,我们用pollyfill的方法。
作用
Object.assign() 方法用于把一个或多个源对象的可枚举属性值复制到目标对象中,返回值为目标对象。
语法
Object.assign(target, ...sources)
参数
target: 目标对象
sources: 源对象
返回值
目标对象
描述
Object.assign 方法只复制源对象中可枚举的属性和对象自身的属性。它在源对象上使用 [[Get]], 在目标对象上使用 [[Set]], 会调用 getter 和 setter。它不适合用于把一个包含 getter 的对象属性合并到一个原型中。如果要把属性定义连同可枚举性复制到一个原型中,应该使用 Object.getOwnPropertyDescriptor() 和 Object.defineProperty() 方法。
String 和 Symbol 类型的属性都会被复制。
当发生错误时,例如有一个属性是不可写的,将会抛出一个 TypeError 错误,目标对象保持不变。
注意 Object.assign() 源对象为 null 或 undefined 时不会报错。
jian示例
克隆对象
var obj = {a: 1};
var copy = Object.assign({}, obj);
console.log(copy); // {a: 1};
合并对象
var o1 = {a: 1};
var o2 = {b: 2};
var o3 = {c: 3};
var obj = Object.assign(o1, o2, o3);
console.log(obj); //{a: 1, b: 2, c: 3}
console.log(o1); //{a: 1, b: 2, c: 3}, 目标对象被改变了
ES5版本实现方法
/**
* 对象合并polyfill
* */
function zyEs6AssignPolyfill() {
if (!Object.assign) {
Object.defineProperty(Object, "assign", {
enumerable: false,
configurable: true,
writable: true,
value: function (target, firstSource) {
"use strict";
if (target === undefined || target === null)
throw new TypeError("Cannot convert first argument to object");
var to = Object(target);
for (var i = 1; i < arguments.length; i++) {
var nextSource = arguments[i];
if (nextSource === undefined || nextSource === null) continue;
var keysArray = Object.keys(Object(nextSource));
for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex++) {
var nextKey = keysArray[nextIndex];
var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
if (desc !== undefined && desc.enumerable) to[nextKey] = nextSource[nextKey];
}
}
return to;
}
});
}
}
参考文献:http://www.cnblogs.com/heiye168/p/5689006.html