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 中,像 undefined
、null
、0
、""
、NaN
这样的值被认为是“虚假的”,而所有对象都被认为是“真实”。这里用来检测this.circle
没有被赋值,也就是说onAssetsLoaded
还没有被调用,this.circle
还是undefined
。
我一直在看这个游戏引擎的例子,我真的不明白为什么它会重新分配对象,我在 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 中,像 undefined
、null
、0
、""
、NaN
这样的值被认为是“虚假的”,而所有对象都被认为是“真实”。这里用来检测this.circle
没有被赋值,也就是说onAssetsLoaded
还没有被调用,this.circle
还是undefined
。