调用同一“类”的另一个方法这个上下文在Javascript中是不同的

Call another method of the same "class" with this context being different in Javascript?

本文关键字:上下文 Javascript 是不同 另一个 调用 方法      更新时间:2023-09-26

我正在研究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实例?

确保thisonRawMessage中始终是正确的(即指向类实例)的唯一方法是将其绑定在构造函数中:

this.onRawMessage = this.onRawMessage.bind(this);

问题是onRawMessage可以被我的程序和其他开发人员在类之外调用,因此this.decode()中的this不再指向我的类。

在我看来,确保其他开发人员的代码正常工作不一定是你的责任。当然,这对他们来说是很方便的,但他们也应该期望该方法没有正确的实例就不能工作,因为大多数方法都是这样的。

同样,虽然它们当然可以调用该方法,但它似乎没有多大意义,因为它期望一个非常特定的事件对象。如果它们像socket.onRawMessage(...)那样调用它,那么this无论如何都会正确地指向socket