复制javascript对象然后修改它而不更改原始实例?

时间:2012-01-25 18:58:30

标签: javascript oop

Order.prototype.selectItem = function(newItem) { ...

newItem是我要复制的对象,然后修改副本而不修改原始newItem。

var newSelectedItem = newItem;
newSelectedItem.orderIndex = this.selectedItems.length + 1;

更改副本的orderIndex也会更改原始newItem。

问题:如何在不修改原始newItem的情况下复制然后修改副本。

谢谢!

3 个答案:

答案 0 :(得分:2)

创建新对象

var newSelectedItem = {};

将旧对象中的所有属性复制到新对象

for(var prop in newItem){
    if(newItem.hasOwnProperty(prop)){
        newSelectedItem[prop] = newItem[prop];
    }
}

请注意,此解决方案仅适用于平坦的普通对象。如果“newItem”是某个原型的实例,则不能仅使用{}创建新对象,如果属性可以包含可变数组或对象,则还需要执行递归深层复制。

有关更多示例,dojo工具包具有一些用于执行此类操作的函数(mixin和clone):http://trac.dojotoolkit.org/browser/dojo/dojo/trunk/_base/lang.js

答案 1 :(得分:1)

如果您正在使用jQuery(我建议使用),您可以按照以下帖子克隆对象: What is the most efficient way to deep clone an object in JavaScript?

答案 2 :(得分:0)

您不一定需要克隆该对象。如果您想要做的只是拥有一个对象,您可以在不改变原始属性的情况下设置属性,那么所谓的“Boodman / Crockford委托”就会更有效率。我希望在我第一次使用它时发布它:)参见dojo.delegate