如何访问本机对象调用的函数中的实例?

pim*_*vdb 2 javascript this instance

我承认我已经问了一个关于this关键字及其在某些情况下意味着什么的问题,但我仍然不完全理解它,我害怕.任何提示将不胜感激.

我基本上有一个Socket类,它是HTML5的WebSocket类的包装器,使事情变得更容易(我只复制了与我的问题相关的内容):

var Socket = function(url) {
    this.url = url;
    this.webSocket = null;
}

Socket.prototype.init = function() {
    this.webSocket = new WebSocket(this.url);
    this.webSocket.onmessage = this.parseMessage;
};

Socket.prototype.parseMessage = function(event) {
    console.log(this); // logs the WebSocket (native) instance
}
Run Code Online (Sandbox Code Playgroud)

在parseMessage函数中,this引用本机WebSocket对象的实例,那么如何Socket在此处访问实例到我的对象?

非常感谢.

Mat*_*att 5

你可以bind:

this.webSocket.onmessage = this.parseMessage.bind(this);
Run Code Online (Sandbox Code Playgroud)

但是,并非所有浏览器本机都支持此功能,但您可以从MDC获取代码段以使所有浏览器兼容.

在您不熟悉绑定时......它允许您具体指定调用该函数时this 应该是什么.在该行运行时,this是您的Socket类实例,因此您基本上强制this parseMessage 内部指向实例.

如果由于某种原因,您不想使用bind,则另一个选项是将this变量保存到变量中,以便在事件发送中不会丢失含义:

Socket.prototype.init = function() {
    this.webSocket = new WebSocket(this.url);
    var _self = this;
    this.webSocket.onmessage = function (event) {
        _self.parseMessage.apply(_self, [event]);
    };
};
Run Code Online (Sandbox Code Playgroud)