JavaScript:如何制作对象的副本?

时间:2014-02-09 19:48:21

标签: javascript object copy javascript-objects

我正在尝试创建对象a的副本,而不必手动将其属性输入到对象b中。在这段代码中,b只是指一个。我想创建一个新版本的a,所以当我向b添加一个属性时,它是不可见的。

var a = new Object(); // create an empty object
var b = a;             // now b refers to the same object
b.test = 1;            // add a new property to b
alert(a.test);         // => 1: the new property is also visible through a
a === b;               // => true: a and b refer to the same object

4 个答案:

答案 0 :(得分:3)

在纯JavaScript中你可以这样做:

var copy = JSON.parse(JSON.stringify(myObj));

请参阅:http://jsfiddle.net/kukiwon/AyKdL/

答案 1 :(得分:2)

使用Javascript对象和equals( = )运算符时必须小心。此运算符不会创建对象的副本,而只会分配对原始内部对象的引用。

这意味着,在您的情况下, b 存储 a 的值,但在调用后

var b = a;

a b 指向内存中的同一个对象!因此,更改 b 的任何属性也会为 a 更改它们(再次:它们在内部是相同的对象)。

要创建对象的副本,您必须手动复制它的每个属性:

var a = {};  // create an empty object
a.prop1 = 1; // set a property of this object
var b = {};  // create another empty object
b.prop1 = a.prop1; // copy all properties (in this case: only one) of a to b
b.test = 1;  // add a new property to b
alert(a.test); // => undefined, as .test is only defined for b
a === b; // => false, as a and b are different objects.

可以在此处找到克隆JS对象问题的优雅解决方案:How do I correctly clone a JavaScript object?

答案 2 :(得分:2)

如何使用下面的深层复制模式。 这是来自Stoyan Stefanov的“Javascript Patterns”。

function extendDeep(parent, child) {
    var i,
        toStr = Object.prototype.toString,
        astr = "[object Array]";

    child = child || {};

    for (i in parent) {
        if (parent.hasOwnProperty(i)) {
            if (typeof parent[i] === "object") {
                child[i] = (toStr.call(parent[i]) === astr) ? [] : {};
                extendDeep(parent[i], child[i]);
            } else {
                child[i] = parent[i];
            }
        }
    }
    return child;
}

答案 3 :(得分:1)

在您的示例中,“a”只是一个函数对象,您只是在创建其他指针。

只需创建一个新实例

var a1 = new a();
var b1 = new a();
a1.test = 1;
b1.test = 2;

a1 != b1

将函数用作类的优点是利用object.prototype,继承和实例检查。如果您只想要一个数据存储,那么只需将其更改为通用对象

var a = {};
var b = {};
a.test = 1;
b.test = 2;

“JavaScript the Good Parts”绝对必须

http://www.youtube.com/watch?v=hQVTIJBZook

http://www.amazon.com/JavaScript-Good-Parts-Douglas-Crockford/dp/0596517742