用ES6类传递一个实例方法给super
Passing an instance method to super with ES6 classes
据我所知,在调用super( )
之前,this
在构造函数中不可用。
但是,当引用实例方法时,我们需要在方法前面加上this
。那么如何将实例方法传递给super( )
呢?
。在相位器框架中,有一个Button
类。构造函数接受click事件的回调:
构造函数
new Button(game, x, y, key, callback, callbackContext, overFrame, outFrame, downFrame, upFrame)
callback -按下此按钮时调用的函数。
callbackContext -回调被调用的上下文(通常是'this')。
我想要我自己的按钮类,我这样定义:
class MyButton extends Phaser.Button {
constructor(game) {
super(game, game.world.centerX, game.world.centerY, 'buttonImage');
}
clickHandler(button, pointer) {
//handle the clicking
}
}
如何将clickHandler
传递给super
呢?
this.clickHandler
给出错误[Build Error] 'this' is not allowed before super() while parsing file: ....
,传递clickHandler
给我一个运行时错误Uncaught ReferenceError: clickHandler is not defined
。
有什么建议吗?
这是ES6箭头函数的一个很好的用例,它在词法上绑定到this
。
下面是一个记录实例派生值的通用示例,通过使用箭头函数代理对实例方法的调用:
(在ES6的REPL上尝试一下,或者在babel中查看它的编译)
class A {
constructor(method) {
if(method) {
method()
return
}
this.callback()
}
message() {
return "a"
}
callback() {
console.log(this.message())
}
}
class B extends A {
constructor() {
super(() => this.callback())
}
message() {
return "b"
}
callback() {
console.log(this.message())
}
}
可以看到,这样做可以避免在调用super
之前立即引用新实例的thisArg
。在您给出的示例中,它是这样实现的:
class MyButton extends Phaser.Button {
constructor(game) {
super(
game,
game.world.centerX,
game.world.centerY,
'buttonImage',
() => this.clickHandler()
);
}
clickHandler(button, pointer) {
//handle the clicking
}
}
相关文章:
- 同一项怎么可能在一个实例中未定义,却在另一个实例上定义
- 你能把一个匿名方法(函数)动态地变成一个命名方法吗
- 将其中一个异步方法重写为使用promise的方法
- jQuery"焦点”;在一个实例中有效,但在其他实例中无效
- 当与另一个实例进行比较时,我的类实例如何隐式返回数字
- 为什么可以't我使用成员方法初始化一个实例
- 从实例方法调用实例方法
- 如何使用 JavaScript 正则表达式搜索除一个实例之外的所有内容
- 如何在jQuery插件中创建一个公共方法
- 挖空视图模型函数仅影响最后一个实例
- 插件总是只得到最后一个实例,如何让它适用于多个元素
- Meteor:如何遍历一个数组,这是一个异步方法的结果
- Javascript:在对象实例方法上使用apply()方法失败
- arguments变量是的一个实例
- 使用javascript删除特定HTML实体(breadcrumb)的最后一个实例
- 如何将异步方法返回的值发送到javascript中的另一个异步方法
- 我将如何创建一个带有私有变量的实例方法
- javascript中的闭包与c++中的类实例(它有一个私有成员和一个公共方法)相当吗
- 用ES6类传递一个实例方法给super
- 当将实例方法传递给另一个函数时,如何访问实例方法中的实例属性