如何使用 'this' 关键字规避 ES6 Class 范围问题
How to circumvent the ES6 Class scoping issue with 'this' key word
例如在Class构造函数中:
Socket.on('user:join', onUserJoin);
'onUserJoin' 被声明为 class 的方法,但被 socket.io 调用,因此 'this'
不是我的 Class。解决此问题的一种方法是使用 '=>'
函数。
示例:
Socket.on('user:join', (data)=>{
this.isOnline = true;
});
现在 'this'
是我的 class,但是我如何引用这个匿名函数来取消订阅?
socket.removeListener('user:join', ????);
我试过这个:
let self;
class RoomController {
constructor() {
self = this;
}
...
}
并在方法中引用 self,但 self 正在跨套接字共享...
命名匿名函数可以解决它,但我更喜欢绑定选项。
您可以使用 Function.prototype.bind
.
Socket.on('user:join', onUserJoin.bind(this));
这确保 onUserJoin
具有正确的上下文,这将是您的 class 的实例。
您始终可以将箭头函数绑定到名称。
例如,
class RoomController {
constructor() {
this.flag = true;
}
// Assign the arrow function to the name `setFlag`
setFlag = (v) => this.flag = v;
}
let r = new RoomController();
function tester(func) {
func(false);
console.log(r.flag);
// false
func(true);
console.log(r.flag);
// true
}
// Now you can pass the function around, `this` will still refer the object `r`
tester(r.setFlag);
例如在Class构造函数中:
Socket.on('user:join', onUserJoin);
'onUserJoin' 被声明为 class 的方法,但被 socket.io 调用,因此 'this'
不是我的 Class。解决此问题的一种方法是使用 '=>'
函数。
示例:
Socket.on('user:join', (data)=>{
this.isOnline = true;
});
现在 'this'
是我的 class,但是我如何引用这个匿名函数来取消订阅?
socket.removeListener('user:join', ????);
我试过这个:
let self;
class RoomController {
constructor() {
self = this;
}
...
}
并在方法中引用 self,但 self 正在跨套接字共享...
命名匿名函数可以解决它,但我更喜欢绑定选项。
您可以使用 Function.prototype.bind
.
Socket.on('user:join', onUserJoin.bind(this));
这确保 onUserJoin
具有正确的上下文,这将是您的 class 的实例。
您始终可以将箭头函数绑定到名称。
例如,
class RoomController {
constructor() {
this.flag = true;
}
// Assign the arrow function to the name `setFlag`
setFlag = (v) => this.flag = v;
}
let r = new RoomController();
function tester(func) {
func(false);
console.log(r.flag);
// false
func(true);
console.log(r.flag);
// true
}
// Now you can pass the function around, `this` will still refer the object `r`
tester(r.setFlag);