调用相同的另一个方法";“类”;这个上下文在Javascript中是不同的吗?
我正在编写调用相同的另一个方法";“类”;这个上下文在Javascript中是不同的吗?,javascript,oop,reference,this,Javascript,Oop,Reference,This,我正在编写WebSocket的包装,我对这个上下文有一个问题。请注意,通过阅读StackOverflow文章,我已经理解了为什么会出现这个问题,但现在如何解决它 这是我现在的课 MusicArena.JsonWebSocket = function (url, onOpen, onMessage, onError) { this.webSocket = new WebSocket(url); this.webSocket.onmessage = this.onRawMessage
WebSocket
的包装,我对这个
上下文有一个问题。请注意,通过阅读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
实例?确保在onRawMessage
中始终正确(即指向类实例)的唯一方法是在构造函数中绑定它:
this.onRawMessage = this.onRawMessage.bind(this);
问题是我的程序和其他开发人员可以在类外调用onRawMessage
,因此this.decode()
中的this不再指向我的类
在我看来,确保其他开发人员的代码正常工作并不一定是您的责任。当然,让它对他们来说更方便是很好的,但是他们也应该期望,如果没有正确的实例,该方法将无法工作,因为大多数方法都是这样
此外,虽然他们当然可以调用该方法,但它似乎没有多大意义,因为它需要一个非常特定的事件对象。如果他们像socket.onRawMessage(…)
那样调用它,那么这个
无论如何都会正确地指向socket
。你能给出一个用法示例吗?为什么不直接调用函数:MusicArena.JsonWebSocket.prototype.decode(数据)
?@KingMob我只是简单地初始化并从外部调用该方法(我们同时有多个HTML5WebSocket
实例),没有什么特别的,就像this.WebSocket.onmessage=this.onRawMessage.bind(this)
没有绑定
,因为它是由其他开发人员开发的。@Vidul哇,说真的,可以这样称呼它吗?我不知道。这样做的任何缺点,或问题,或变量问题,例如,如果我在构造函数中使用this.a=something赋值的变量
?@DatVM我不理解关于变量问题的问题this.a=simething
(这只是一个属性定义)。但是,没有缺点或问题,如果您不需要将decode
作为方法,您可能应该将其从原型链中删除,并用一个函数替换它:var decode=function(encoded){…}
。这很简单!非常感谢您的回答和建议。我将与他们讨论这个问题,并决定他们是否必须绑定该实例,或者我自己这么做。在我的环境中,存在多个具有相同处理的WebSocket
事件,但这是有意义的:)