2014-02-05 14 views
3

如果MyObj中是一個JavaScript對象,將將this.myObj = myObj存儲引用或複製/快照?

this.myObj = myObj 

創造的是什麼物體看起來像此刻拷貝/快照,或將其存儲到實際對象的引用?

我有什麼似乎是同一個對象,這就是爲什麼我開始懷疑我是不是在事實上維護副本時,我不想的雙套麻煩......

+1

應該很容易測試 - > http://jsfiddle.net/6cBKp/ – adeneo

回答

0

一基準,可以肯定的:

var foo = function() {}; 
var foo_instance = new foo(); 
var bar = { 
    foo: foo_instance 
}; 
console.log(foo_instance === bar.foo); // true 

如果要克隆的對象,你有兩個選擇:

的jQuery:

var foo = function() {}; 
var foo_instance = new foo(); 

var foo_instance_clone = new foo(); 
$.extend(foo_instance_clone, foo_instance); 

純JavaScript:

var foo = function() {}; 
var foo_instance = new foo(); 

var foo_instance_clone = new foo(); 
for (var key in foo_instance) { 
    if (foo_instance.hasOwnProperty(key)) { 
     foo_instance_clone[key] = foo_instance; 
    } 
} 
2

它是對對象的引用。有一個對象有兩種「尋址」方式。

function Cls(obj) { 
    this.myObj = obj; 
} 

var foo = { bar : 1 } 
var x = new Cls(foo); 

foo.bar = 2; 
console.log(x.myObj) // { bar : 2 } 
2

您只是分配一個對象的引用。畢竟,您只能在ECMAscript中處理參考文獻。沒有像你可以在內存中處理或克隆它的「實際對象」這樣的事情。那麼你可以克隆它,但是這隻會在HEAP上創建另一個對象,你會得到一個參考到。

認爲它是這樣的...

var newObj = { }; 

現在發生的事情是,新的目標是形成/在堆上創建的地方,你必須在你的newObj變量,一個參考。當我們像

newObj.foo = newObj 

我們只是引用同一個對象,在HEAP的某處。沒有魔法。