javascript 中难以理解的对象重新分配

Incomprehensible object reassignment in javascript

我一直在看这个游戏引擎的例子,我真的不明白为什么它会重新分配对象,我在 java 中编码并且我正在学习 javascript,可能是概念错误。

例子 https://blacksmith2d.io/Docs/Examples/Arcade-Physics/CollisionEvents

onassetsLoaded() 事件他正在设置对象属性,然后在下面再次重新分配它。

this.arcade = arcade;
this.circle = circle;
this.box = box;

我也不明白if语句的这一部分

!this.circle 

Java 和 Java 脚本类似于汽车和地毯 :-)。你在Java获得的知识不能直接转置

与 Java 不同,在 Java 脚本中对对象属性的访问是明确的:this. 的使用是强制性的。 从同一个 class 调用方法时也是如此(您需要使用 this.

class SomeClass {
   constructor() {
       this.param1 = 42;
   }

   localAndParameter(param1) {
       console.log(this.param1); // prints "42"
       console.log(param1); // prints "666"
   }

   localAndGlobal() {
       console.log(this.param1); // still "42"
       console.log(param1); // prints 123
   }

   callMethods() {
       this.emptyMethod(); // this works
       emptyMethod(); // This would raise an exception if called
       // "emptyMethod" is undefined or something like that
   }

   emptyMethod() {
   }
}

const param1 = 123;
const obj = new SomeClass();
obj.localAndParameter(666);
obj.localAndGlobal();

语言也是动态的。

任何时候都可以向对象添加属性,而不仅仅是 declared/constructed

class SomeClass {
   constructor() {
       // no properties created.
   }

   someMethod() {
       // everything is dynamic! I can create a property here
       this.newProperty = 23;
   }
}

const obj = new SomeClass()
console.log(obj.newProperty); // prints "undefined"
obj.someMethod();
console.log(obj.newProperty); // prints "23"

关于这些声明:

this.arcade = arcade;
this.circle = circle;
this.box = box;

在该代码块的前面,出现在右侧的所有变量都被定义为 local 变量(方法 onAssetsLoaded 的局部变量):

const arcade = ...
const circle = ...
const box = ...

所以你想知道的赋值实际上是将引用从局部变量复制到实例变量(即属性)。这是为了在 onAssetsLoaded 调用完成后不会丢失此信息。

关于这个表达式:

!this.circle 

非运算符 (!) 可用于任何表达式。当操作数为“falsy”时,它的计算结果为 true。在 JavaScript 中,像 undefinednull0""NaN 这样的值被认为是“虚假的”,而所有对象都被认为是“真实”。这里用来检测this.circle没有被赋值,也就是说onAssetsLoaded还没有被调用,this.circle还是undefined