3

我已将(客户端)socket.io 包装在原型类中:

Chat.Client = Class.create();

Chat.Client.prototype = {

    initialize: function() {
        ...
        this.socket.on('message', this.on_message);
        ...
    },

    on_message: function(data) {
        this.add_chat_message(data.something);
    }

    do_something: function(something) {
        ...
    }

这不起作用,因为 on_message 中的“this”将是“SocketNamespace”。传统上我会通过将“this”作为附加参数传递给回调来解决这个问题,但是因为我使用的是 socket.io,所以我不能简单地这样做。

我该如何解决这个问题?

4

1 回答 1

10

您可以将其包装在另一个函数中:

initialize: function() {
  // ...
  var client = this;
  this.socket.on('message', function(data) { client.on_message(data); });

在较新的浏览器(或 Node.js)中,您也可以在Function原型上使用名为“bind”的函数:

  this.socket.on('message', this.on_message.bind(this));

“bind”函数返回一个函数,当调用该函数时,将强制以给定值作为this值调用原始函数(“on_message”)。

于 2012-04-13T13:32:58.673 回答