在自定义Phaser类中使用'this':this.scene与scene的选择疑问
在Phaser.js自定义类中,
this.scene vs 直接用scene的优缺点对比 假设你的Chest类构造函数是这样的:
class Chest extends Phaser.GameObjects.Sprite { constructor(scene, x, y) { super(scene, x, y, 'chest'); this.scene = scene; // 把scene挂载到实例属性 // 这里纠结用this.scene还是直接用scene? } }
下面直接对比两种用法的优劣:
直接使用局部变量scene
- 优势:
- 少了一次实例属性查找,性能上有极其微小的提升(只有在创建上万级别的实例时才可能察觉到)
- 代码更短,构造函数内写起来更顺手
- 劣势:
- 仅限构造函数内部或构造函数里定义的闭包函数能用,类的其他原型方法(比如
open()、update())根本访问不到这个局部变量 - 如果后续要在其他方法里操作scene,只能把scene作为参数传递,代码会变得冗余,还容易漏传
- 不符合类的封装逻辑,实例的依赖项没挂载到自身上,调试时没法直接从实例对象里看到scene的引用
- 仅限构造函数内部或构造函数里定义的闭包函数能用,类的其他原型方法(比如
使用this.scene(实例属性)
- 优势:
- 类的所有方法都能直接访问scene,不用额外传参,比如写
open()方法时直接this.scene.tweens.add(...)就行,逻辑连贯 - 符合面向对象的封装原则,实例的依赖清晰,调试时在浏览器控制台打印Chest实例,能直接看到
this.scene的引用,方便排查问题 - 扩展性强,后续加新方法不用考虑scene的传递问题,直接用就行
- 类的所有方法都能直接访问scene,不用额外传参,比如写
- 劣势:
- 每次访问多了一层属性查找,但在Phaser的游戏场景里,这种性能差异完全可以忽略,没必要纠结
- 代码里多了
this.前缀,稍微多敲几个字符,但换来了代码的可维护性
实际开发推荐
在Phaser开发自定义游戏类时,优先选this.scene。游戏对象类通常会有多个方法(比如交互、更新、动画控制),都需要依赖scene来调用Phaser的API,用实例属性能让所有方法统一访问,避免到处传参的麻烦。
如果只是构造函数内部的临时逻辑(比如初始化时加个物理体),用局部变量scene也没问题,但别在其他方法里依赖它。
内容的提问来源于stack exchange,提问作者maddogandnoriko
相关产品推荐
相关产品推荐

