Javascript shallow copies
Javascript shallow copies
我是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
在最后一个print语句中,我期望my_pos。因为my_pos现在指向my_vect(还是指向my_vect ?)我对Javascript的理解是,实际上只有原始值被复制,对象赋值维护对对象的单个副本的引用。看起来在my_vect赋值之后,my_pos引用在某种程度上被"分离"了,不再指向my_sprite.pos。
是否有一些Javascript的行为,我在这里忽略了?
谢谢!
你的代码有更多的注释,希望这对你有帮助
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指向vector#1(你赋值的是指针,而不是数据)
var my_vect = new MyVector(); // my_vector is on the heap
创建一个新的MyVector,我们称它为vector#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
你没有忽略任何东西。
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
指向的内容。