我对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行为吗?
谢谢!
答案 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
指向的内容。