2014-02-09 28 views
0

我正在嘗試創建對象a的副本,而無需手動將其屬性輸入到對象b中。在這個代碼中,b簡單地指的是a。我想創建一個新版本的a,所以當我向b添加一個屬性時,它通過a不可見。JavaScript:如何製作一個對象的副本?

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 
+2

'存儲a的值(b)應該是「將同一對象的引用賦值給'b'」。 – RobG

+1

你真的打算'a'是一個函數嗎?您在該行的評論意味着其他情況。 –

+0

「b指向同一對象」意味着「向b添加新屬性」等於「向a添加新屬性」。 「 – leaf

回答

2

您有JavaScript對象和等號(= )運算符的工作時要小心。該運算符不會創建該對象的副本,而只會分配對原始內部對象的引用。

這意味着,你的情況,b店的值(S)的一個,但調用

var b = 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?

+0

*」'a'實際上不是一個對象「*它是!函數也是對象。 –

+0

你是對的!據此編輯。 – dominikus

3

在普通的JavaScript,你可以這樣做:

var copy = JSON.parse(JSON.stringify(myObj)); 

參見:http://jsfiddle.net/kukiwon/AyKdL/

+1

這當然不適用於功能。 –

+0

@FelixKling,正確,但這個問題應該改變。 – Kukiwon

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好的部分」是絕對必要的

http://www.youtube.com/watch?v=hQVTIJBZook

http://www.amazon.com/JavaScript-Good-Parts-Douglas-Crockford/dp/0596517742

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

if(parent.hasOwnProperty(i)&&!child.hasOwnProperty(i)){....}如果你不想覆蓋屬性是那裏 – zloctb

相關問題