gpt4 book ai didi

javascript - 调用相同 "class"的另一个方法,但 JavaScript 中的上下文不同?

转载 作者:行者123 更新时间:2023-12-02 15:52:42 25 4
gpt4 key购买 nike

我正在开发 WebSocket 的包装器,但我遇到了有关 this 上下文的问题。请注意,通过阅读 StackOverflow 文章,我已经了解了问题发生的原因,但现在如何解决它。

这是我当前的类(class)

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 不再指向我的类(class)。有没有办法在 onRawMessage 中调用 decode 而无需用户绑定(bind) JsonWebSocket 实例?

最佳答案

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

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

The problem is that onRawMessage can be being called outside of the class by my program and other developers, and so the this in this.decode() does not point to my class anymore.

IMO,您不一定有责任确保其他开发人员的代码正常工作。当然,让他们更方便是件好事,但他们也应该预料到如果没有正确的实例,该方法就无法工作,因为大多数方法都是这种情况。

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

关于javascript - 调用相同 "class"的另一个方法,但 JavaScript 中的上下文不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31762352/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com