2011-04-26 193 views
2

我對Javascript相當陌生,遇到了對象引用的問題。以下是重現問題的代碼片段。Javascript淺拷貝

function MyVector() { 
    this.x = 0; 
    this.y = 0; 
} 

function MySprite() { 
    this.pos = new MyVector(); 
} 

var my_sprite = new MySprite(); 
var my_pos = my_sprite.pos; // my_pos points to my_sprite's vector 
var my_vect = new MyVector(); // my_vector is on the heap 
my_vect.x = 69; 

print("my_pos.x: " + my_pos.x); // prints 0 (expected) 

my_sprite.pos = my_vect;   // should point to my_vect 

print("my_sprite.pos.x: " + my_sprite.pos.x); // prints 69 (expected) 
print("my_pos.x: " + my_pos.x); // prints 0, expected to print 69 

在最後的打印語句,我會一直期待my_pos.x打印69自my_pos現指my_vect(或不是嗎?)。我對Javascript的理解是,只有原始值被實際複製,並且對象分配保持對該對象的單個副本的引用。它看起來像在my_vect賦值之後,my_pos引用以某種方式「分離」並且不再指向my_sprite.pos。

我在這裏忽略了Javascript的某些行爲嗎?

謝謝!

回答

2

你有更多的評論代碼,希望這有助於

function MyVector() { 
    this.x = 0; 
    this.y = 0; 
} 

function MySprite() { 
    this.pos = new MyVector(); 
} 

var my_sprite = new MySprite(); 

在這一點上,創建一個新的MyVector()並分配給my_sprite.pos。讓我們把它叫做矢量#1

var my_pos = my_sprite.pos; // my_pos points to my_sprite's vector 

my_pos點矢量#1(您指定的指針,而不是數據)

var my_vect = new MyVector(); // my_vector is on the heap 

新MyVector創建我們稱之爲載體2#。此外,my_vect點矢量#2

my_vect.x = 69; 

print("my_pos.x: " + my_pos.x); // prints 0 (expected) 

my_sprite.pos = my_vect;   // should point to my_vect 

my_sprite的POS成員現在指向矢量#2

print("my_sprite.pos.x: " + my_sprite.pos.x); // prints 69 (expected) 

但my_pos仍指向矢量#1,因爲它永遠不會重新分配!

print("my_pos.x: " + my_pos.x); // prints 0, expected to print 69 
+0

謝謝,這清除了事情。一旦分解,似乎更加明顯。 – lhumongous 2011-04-26 18:37:59

0

你不能忽略任何東西。

var my_sprite = new MySprite(); 

所以在這裏,

my_sprite.pos == new myVector(); 
var my_pos = my_sprite.pos; // my_pos equals that new myVector. 

你永遠不會重新分配my_pos,所以它仍然等於新myVector當你打印出來。 當在javascript中分配變量時,my_pos不指向my_sprite.pos,因爲my_sprite.pos也是一個指針,所以它簡單指向my_sprite.pos指向什麼。

+0

我不能告訴你的答案是什麼是代碼和什麼是散文。它傷害閱讀。 – 2011-04-26 18:11:52

+0

最初,我認爲有一些動態查找魔術發生在my_pos實際引用my_sprite.pos *當前*引用的向量的地方。正如Damp指出的那樣,事實並非如此。它引用my_sprite.pos在my_pos分配時指向的向量。基本上,我過分複雜化了這個問題。 – lhumongous 2011-04-26 18:54:59