JavaScript对象的浅拷贝未定义?

3

我刚开始学习Javascript大约一个星期,所以请多包涵。我试图使用四叉树和节点作为所有对象的支持结构来制作基本的物理引擎。然而,在这段代码中:

102 Quadtree.prototype.insert= function(self, object){
103     if (object == null){
104         return;
105     }
106     var objectx,
107         objecty,
108         objectw,
109         objecth;
110     objectx = object.getDim()[0];
111     objecty = object.getDim()[1];
112     objectw = object.getDim()[2];
113     objecth = object.getDim()[3];
114     var cn = root;
115     if(cn == undefined){
116         console.log("asdgalkjh");
117     }

当前节点(cn)返回未定义。对象也为空。

我知道我的问题是由于不了解JavaScript对象的详细工作原理引起的。有人可以给我一个概述或指导我在哪里阅读吗?谢谢。

这里是我的节点和四叉树类,供参考。

94 function Quadtree(width,height){
95     this.width = width;
96     this.height = height;
97     this.MAX_LEVELS = 4;
98     this.MAX_OBJ = 2;
99     var root = new Node(0,0,width,height);
100     root.split();
101 }

13 function Node(x,y,width,height){
14     var x,
15         y,
16         width
17         height;
18     this.x = x;
19     this.y = y;
20     this.width = width;
21     this.height = height;
22     var hash = 0;
23     var objects = new Array();
24     var parent = null;
25     var child1 = null;
26     var child2 = null;
27     var child3 = null;
28     var child4 = null;
29 }

我意识到我可能做了很多错误的事情,因为我来自于一个重 Java 的背景,JavaScript 对象是通过“引用调用”传递的,这也让我感到困惑。非常感谢任何帮助。


我对你的“按引用调用”语句感到困惑。Java和Javascript都是传值语言,但(几乎)所有变量都是引用。在这方面,Java和Javascript的行为方式相同。 - Mashmagar
啊,你说得对。问题仍然存在,为什么我不能将currentnode设置为根节点呢? - jknam
只是好奇:你在构建什么?它是开源的吗? - rpax
我正在作为一个副业开发物理引擎。目前我想要它具备的主要功能包括重力、用户能够投掷物体以及高效的物体碰撞。我不到一周之前才开始着手开发,但到目前为止,它非常有趣。我想这从技术上讲是开源项目哈哈。如果你想帮忙,我会非常感激。 - jknam
1个回答

1
你正在尝试访问一个私有变量root,它只能在QuadTree构造函数中访问。
如果你想在其他地方使用它,你需要创建一个getter或将其放入公共成员(即this.root = new Node(0,0,width,height);),然后使用this.root访问它。

那么,通过使用 this.root 而不是 var,它就变成了公共成员?而 var 使其变为私有的? - jknam
是的,但这都是因为JavaScript作用域的工作方式。当您使用var时,您将其定义为第一个包装函数(即QuadTree),并且所有在此函数内部的函数也可以访问它。 - axelduch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接