我正在尝试创建对象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
答案 0 :(得分:3)
在纯JavaScript中你可以这样做:
var copy = JSON.parse(JSON.stringify(myObj));
答案 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