2010-08-13 115 views

回答

6

您必须遍历该对象并复制其所有属性。

然后,如果它的任何属性也是对象,假设你想克隆它们,你将不得不缓存到它们中。

有在这里做这个的各种方法: What is the most efficient way to clone a JavaScript object?

+1

还要注意,这不是一刀切的 - 这不太可能对内置对象(如您希望使用cloneNode()方法等的DOM节点)有用。 – thomasrutter 2010-08-13 07:35:51

1
function objToClone(obj){ 
    return (new Function("return " + obj)) 
} 
+3

EW,的eval()!不知道这也可以,除非obj有一个有意义的toString()方法。 – thomasrutter 2010-08-13 07:22:39

+0

会不会返回一个引用? – borrel 2013-07-31 13:21:55

6

这是我怎么会做它的基础上,thomasrutter's suggestion(未测试的代码):

function cloneObj(obj) { 
    var clone = {}; 

    for (var i in obj) { 
     if (obj[i] && typeof obj[i] == 'object') { 
      clone[i] = cloneObj(obj[i]); 
     } else { 
      clone[i] = obj[i]; 
     } 
    } 

    return clone; 
} 
+2

'obj.i '不会工作,你会直接访问''我''属性,你需要使用括号表示法,例如'obj [i]' – CMS 2010-08-13 07:29:38

+1

@CMS:谢谢,我现在修好了。 – BoltClock 2010-08-13 07:45:55

+0

这看起来不对。 cloneObject({name:null})=> {“name”:{}} – Niyaz 2013-02-27 14:39:35

2

JavaScript的JS对象克隆

Object._clone = function(obj) { 
    var clone, property, value; 
    if (!obj || typeof obj !== 'object') { 
    return obj; 
    } 
    clone = typeof obj.pop === 'function' ? [] : {}; 
    clone.__proto__ = obj.__proto__; 
    for (property in obj) { 
    if (obj.hasOwnProperty(property)) { 
     value = obj.property; 
     if (value && typeof value === 'object') { 
     clone[property] = Object._clone(value); 
     } else { 
     clone[property] = obj[property]; 
     } 
    } 
    } 
    return clone; 
}; 

CoffeeScript JS对象克隆

# Object clone 
Object._clone = (obj) -> 
    return obj if not obj or typeof(obj) isnt 'object' 
    clone = if typeof(obj.pop) is 'function' then [] else {} 

    # deprecated, but need for instanceof method 
    clone.__proto__ = obj.__proto__ 

    for property of obj 
    if obj.hasOwnProperty property 
     # clone properties 
     value = obj.property 
     if value and typeof(value) is 'object' 
     clone[property] = Object._clone(value) 
     else 
     clone[property] = obj[property] 

    clone 

现在你可以尝试这样做,

A = new TestKlass 
B = Object._clone(A) 
B instanceof TestKlass => true