一个简单的实现看起来像这样。
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
如果将非对象传递给该函数,则该函数将引发错误。