Javascript浅拷贝

时间:2011-04-26 17:51:34

标签: 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 个答案:

答案 0 :(得分: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,让它称之为vector#2。另外,my_vect指向vector#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成员现在指向vector#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

答案 1 :(得分: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指向的内容。