2010-08-13 43 views

Trả lời

6

Bạn sẽ phải lặp qua đối tượng và tạo bản sao của tất cả các thuộc tính của nó.

Và sau đó nếu bất kỳ thuộc tính nào của nó cũng là đối tượng, giả sử bạn cũng muốn sao chép chúng, bạn sẽ phải recurse vào chúng.

Có phương pháp khác nhau để thực hiện điều này ở đây: What is the most efficient way to clone a JavaScript object?

+1

Lưu ý rằng đây không phải là một kích thước phù hợp - tất cả điều này không có ích cho các đối tượng dựng sẵn như nút DOM nơi bạn muốn sử dụng phương thức cloneNode(), v.v. – thomasrutter

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

Ew, eval()! Không chắc chắn điều này sẽ làm việc, hoặc, trừ khi obj có một phương thức toString() có ý nghĩa. – thomasrutter

+0

sẽ không trả về một tham chiếu? – borrel

6

Đây là cách tôi muốn làm điều đó, dựa trên thomasrutter's suggestion (mã chưa được kiểm tra):

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 'sẽ không hoạt động, bạn sẽ truy cập vào thuộc tính' "i" 'theo nghĩa đen, bạn cần sử dụng ký pháp ngoặc vuông, ví dụ 'obj [i]' – CMS

+1

@CMS: cảm ơn, tôi đã sửa nó ngay bây giờ. – BoltClock

+0

Điều này có vẻ không đúng. cloneObject ({name: null}) => {"name": {}} – Niyaz

2

Javascript JS đối tượng bản sao

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; 
}; 

Bản sao đối tượng 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 

Bây giờ bạn có thể thử để làm điều đó

A = new TestKlass 
B = Object._clone(A) 
B instanceof TestKlass => true 
Các vấn đề liên quan