调用同一“类”的另一个方法这个上下文在Javascript中是不同的
Call another method of the same "class" with this context being different in Javascript?
我正在研究WebSocket
的包装器,我对this
上下文有一个问题。请注意,通过阅读StackOverflow的文章,我已经理解了为什么会出现这个问题,但是现在如何解决它。
这是我当前的类
MusicArena.JsonWebSocket = function (url, onOpen, onMessage, onError) {
this.webSocket = new WebSocket(url);
this.webSocket.onmessage = this.onRawMessage.bind(this); // This is fine
// This key is used by the decode method, and in the future might get value from a parameter.
this.encryptionKey = ENCRYPTION_KEY;
// Other iniitalization code.
};
MusicArena.JsonWebSocket.constructor = MusicArena.JsonWebSocket;
MusicArena.JsonWebSocket.prototype.decode = function (encoded) {
// Process the encrypted message
};
MusicArena.JsonWebSocket.prototype.onRawMessage = function (event) {
var data = event.data;
var decoded = this.decode(data);
var obj = JSON.parse(decoded);
if (DEBUG) {
console.log(obj);
}
if (obj) {
this.onMessage(obj.ID, obj.Action, obj);
};
};
// Other codes
问题是onRawMessage
可以被我的程序和其他开发人员在类之外调用,因此this.decode()
中的this
不再指向我的类了。是否有一种方法可以在onRawMessage
中调用decode
,而不需要用户绑定JsonWebSocket
实例?
确保this
在onRawMessage
中始终是正确的(即指向类实例)的唯一方法是将其绑定在构造函数中:
this.onRawMessage = this.onRawMessage.bind(this);
问题是
onRawMessage
可以被我的程序和其他开发人员在类之外调用,因此this.decode()
中的this不再指向我的类。
在我看来,确保其他开发人员的代码正常工作不一定是你的责任。当然,这对他们来说是很方便的,但他们也应该期望该方法没有正确的实例就不能工作,因为大多数方法都是这样的。
同样,虽然它们当然可以调用该方法,但它似乎没有多大意义,因为它期望一个非常特定的事件对象。如果它们像socket.onRawMessage(...)
那样调用它,那么this
无论如何都会正确地指向socket
。
相关文章:
- 将函数的上下文应用于javascript变量
- 何时可以;我的用户脚本在Javascript中触发右键单击(上下文菜单)
- File Upload事件上下文和javascript
- 什么's在javascript'的优化上下文
- 如何将javascript框架注入ChakraBridge上下文
- 如何删除JavaScript画布呈现上下文的状态堆栈
- javascript中的双上下文切换
- 如何在 v8 中正确恢复 Javascript 上下文
- 如何更改对 javascript 属性的调用的范围/上下文
- 执行上下文和变量对象在 JavaScript 中实际上是一回事吗?
- API Google Maps Javascript在上下文菜单中调用事件侦听器
- 使用Javascript禁用上下文菜单(右键单击)
- 上下文未定义为JavaScript
- Javascript数组过滤器:获取正确的上下文
- 如何设置javascript闭包的上下文
- 如何将javascript从父上下文加载到子上下文中
- javascript中的全局和局部变量执行上下文
- 在javascript上使用这个而不是上下文变量有什么缺点吗
- 执行上下文和Javascript中的执行上下文对象
- 缺少上下文JavaScript