可能是重复问题:
如何克隆js对象?
这是使用对象字面量符号而不是函数创建JavaScript对象的另一种方式:
user = {
name: "Foo",
email: "bar@baz.com"
}
这个对象是否可以被克隆或者它是一个单例模式?
可能是重复问题:
如何克隆js对象?
这是使用对象字面量符号而不是函数创建JavaScript对象的另一种方式:
user = {
name: "Foo",
email: "bar@baz.com"
}
这个对象是否可以被克隆或者它是一个单例模式?
试一试这个:
var clone = (function(){
return function (obj) { Clone.prototype=obj; return new Clone() };
function Clone(){}
}());
下面是代码的具体解释。
Clone
是一个虚构的构造函数。Clone
构造函数的原型。Clone
,因此构造出的对象具有原始对象作为其构造函数的原型,也就是(非标准的)__proto__
。克隆对象将共享原始对象的所有属性,不会复制任何内容。如果为克隆对象的属性分配了新值,则不会影响原始对象。不需要篡改内置函数。
请注意,新创建的对象的属性将引用与克隆对象的同名属性相同的对象。将新值分配给克隆的属性不会影响原始对象,但是对克隆的对象属性进行值分配会影响。
在Chrome或Firebug控制台中尝试:
var user = {
name: "Foo",
email: "bar@baz.com"
}
var clonedUser = clone(user);
console.dir(clonedUser);
你可以在这里找到关于此克隆技术的详细解释。
var abc = {a: 1, b: 2}
,然后尝试使用你的方法var def = clone(abc);
。注意改变abc.a
也会改变def.a
,哈哈。这怎么算是克隆?只有在它们指向同一引用时才会发生这种情况。 - Om Shankarfunction Clone(){}
一样,它被提升了,所以把它放在return
语句后面是令人困惑的。 - Om Shankarabc.a
点。函数提升是JavaScript的一部分,不会产生歧义。我不确定为什么这让你感到困惑。 - Dagg Nabbitvar user = {name: "Foo", email: "bar@baz.com" }
var user2 = JSON.parse(JSON.stringify(user))
user2.name = "Bar";
alert(user.name + " " + user2.name); // Foo Bar
在 jsfiddle 中查看。
编辑
如果你需要在旧浏览器中运行此代码,请参见http://www.json.org/js.html。
属性
和方法
,那么我的朋友,请注意,在使用这种JSON风格时,方法
是不会被克隆的。 - Om Shankar我喜欢使用这个:
if (typeof Object.create !== 'function') {
Object.create = function (o) {
var F = function () {};
F.prototype = o;
return new F();
};
}
那么我想要克隆的任何对象都可以这样做:
user = {
name: "Foo",
email: "bar@baz.com"
};
var user2 = Object.create(user);
正如《JavaScript语言精粹》所示(或类似)
大多数JavaScript框架都对对象克隆有很好的支持。
var a= {'key':'value'};
var b= jQuery.extend( true, {}, a );
Object.prototype.clone = function clone(obj) {
obj = obj || this;
var new_obj = {};
for( var p in obj ) {
if ( obj.hasOwnProperty(p) ) {
if( obj[p] !== null && typeof(obj[p]) === "object" ) {
new_obj[p] = clone( obj[p] );
}
else {
new_obj[p] = obj[p];
}
}
}
return new_obj;
};
/* Example */
var foo = {
name: "Foo"
, email: "bar@baz.com"
, obj: {a:"A",b:"B"}
};
var bar = foo.clone();
bar.name = "Bar";
bar.obj.b = "C";
// foo and bar should have a different 'name'
// foo and bar should retain the same email
// foo and bar should have different values for <foo/bar>['obj']['b']
// foo and bar should have the same values for <foo/bar>['obj']['a']
console.dir(foo);
console.dir(bar);
JQuery
的机器人之一,否则这种说法是不正确的。否则就不要乱动什么,也不要忘记如何做任何事情。 - vol7ronin
迭代对象时,有些开发者会忘记使用hasOwnProperty方法,结果可能会在对象中出现额外的属性,因为其他开发者在不知情的情况下修改了内置对象。 - Dagg Nabbit
Object.create
,请注意这些帖子的日期。除非你认为“深拷贝”是“克隆”的唯一可接受定义,否则你的其余评论完全没有意义,这是荒谬的。 - Dagg NabbithasOwnProperty
。jQuery的clone
显然是以cloneNode
命名的,它是一个DOM函数,与JavaScript或原型语言中“克隆”的通常定义几乎没有关系(DOM内容是与语言无关的)。 - Dagg Nabbit