2011-04-26 104 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