2012-12-27 34 views
-1

我有混合KnockoutJS觀測和標準屬性的對象:與KnockoutJS觀察的性質JavaScript的克隆對象

var original = { 
    a: ko.observable("a"), 
    b: "b" 
}; 

我要創建original對象的克隆,而不提及它,這樣我可以做:

var cloned = clone(original); 
cloned.a("a cloned"); 
original.a(); //-> "a" ERROR HERE 

original.a("a original"); 
cloned.a(); //-> "a cloned" ERROR HERE 

cloned.b = "b cloned"; 
original.b //-> "b" OK 

original.b = "b original"; 
cloned.b //-> "b cloned" OK 

我已經試過與功能,但它造成的KnockoutJS觀察的屬性被複制,也不進行克隆:

cloneObj = function(obj){ 
    if(obj === null || typeof obj !== 'object') 
    return obj; 

    var temp = obj.constructor(); // Give temp the original obj's constructor 
    for (var key in obj) { 
    temp[key] = cloneObj(obj[key]); 
    } 

    return temp; 
}; 

正如你可以在這個小提琴http://jsfiddle.net/Ep3jY/而正常的JavaScript性能得到正確克隆的問題只能用KnockoutJS可觀測性情況看。

現在我用一種變通方法返回一個函數的對象,但是這是很煩人的:

function(){ 
    return { 
    a: ko.observable("a"); 
    }; 
} 
+0

http://stackoverflow.com/questions/122102/what-is-the-most-efficient-way-to-clone-a-javascript-object – HMarioD

+0

對不起,問題是更新:問題是與基因敲除可觀察到的屬性,而正常的js屬性克隆正確 –

回答

-1

好吧,看來這個問題是KnockoutJS觀測。我解決了這個辦法:

cloneObj = function(obj){ 
    if(ko.isWriteableObservable(obj)) 
     return ko.observable(obj()); // This is the trick 
    if(obj === null || typeof obj !== 'object') 
     return obj; 

    var temp = obj.constructor(); // Give temp the original obj's constructor 
    for (var key in obj) { 
    temp[key] = cloneObj(obj[key]); 
    } 

    return temp; 
}; 
+1

沒有爲我工作。它將引用的對象返回給源對象。所以如果你改變輸出對象的某個值,它會影響傳遞的值。 –