另一个对象的属性
这个问题在这里已经有了答案:
function update(obj/*, …*/) {
for (var i=1; i<arguments.length; i++) {
for (var prop in arguments[i]) {
var val = arguments[i][prop];
if (typeof val == "object") // this also applies to arrays or null!
update(obj[prop], val);
else
obj[prop] = val;
}
}
return obj;
}
应该这样做: update(currentObject, updateObject)
。 您可能需要添加一些类型检查,如Object(obj) === obj
以仅扩展真实对象与实际对象,使用数组的正确循环或hasOwnProperty
测试。
我建议使用underscore.js(或更好的,破折号)扩展:
_.extend(目的地,*来源)
将源对象中的所有属性复制到目标对象,然后返回目标对象。 它是有序的,所以最后一个源将在先前的参数中覆盖相同名称的属性 。
_.extend({name: 'moe'}, {age: 50});
=> {name: 'moe', age: 50}
一个简单的实现将看起来像这样。
function copyInto(target /*, source1, sourcen */) {
if (!target || typeof target !== "object")
target = {};
if (arguments.length < 2)
return target;
for (var len = arguments.length - 1; len > 0; len--)
cloneObject(arguments[len-1], arguments[len]);
return target;
}
function cloneObject(target, source) {
if (!source || !target || typeof source !== "object" || typeof target !== "object")
throw new TypeError("Invalid argument");
for (var p in source)
if (source.hasOwnProperty(p))
if (source[p] && typeof source[p] === "object")
if (target[p] && typeof target[p] === "object")
cloneObject(target[p], source[p]);
else
target[p] = source[p];
else
target[p] = source[p];
}
这假设不应该克隆继承的属性。 它也不检查诸如DOM对象或盒装原语之类的东西。
我们需要通过参数进行反向迭代,以便复制按照从右到左的顺序完成。
然后我们创建一个单独的cloneObject
函数来处理嵌套对象的递归复制,其方式不会影响原始对象参数的左右复制。
它还确保初始目标是一个普通对象。
如果一个非对象被传递给它, cloneObject
函数将会抛出一个错误。