调用相同的另一个方法";“类”;这个上下文在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我只是简单地初始化并从外部调用该方法(我们同时有多个HTML5
WebSocket
实例),没有什么特别的,就像
this.WebSocket.onmessage=this.onRawMessage.bind(this)
没有绑定
,因为它是由其他开发人员开发的。@Vidul哇,说真的,可以这样称呼它吗?我不知道。这样做的任何缺点,或问题,或变量问题,例如,如果我在构造函数中使用
this.a=something赋值的变量
?@DatVM我不理解关于变量问题的问题
this.a=simething
(这只是一个属性定义)。但是,没有缺点或问题,如果您不需要将
decode
作为方法,您可能应该将其从原型链中删除,并用一个函数替换它:
var decode=function(encoded){…}
。这很简单!非常感谢您的回答和建议。我将与他们讨论这个问题,并决定他们是否必须绑定该实例,或者我自己这么做。在我的环境中,存在多个具有相同处理的
WebSocket
事件,但这是有意义的:)