【问题标题】:TypeError: Class method is not a function, confused about binding thisTypeError:类方法不是函数,对绑定 this 感到困惑
【发布时间】:2020-08-27 13:43:47
【问题描述】:

我有这个类游戏。

    class Game {
      constructor(player) {
        this.player1 = player;
      }

      getHost() {
        // player has property nickname
        return `Host: ${this.player1.nickname}`;
      }
    }

我相信我遇到的问题是 getHost() 正在脱离它的上下文,但是我不确定如何解决它。我正在学习 JS,我对这种语言对 this 的使用感到非常困惑。我也是第一次使用 socket.io,所以这给我增加了很多困惑。
我的服务器脚本(服务器工作,只显示相关部分):

io.on('connection', (socket) => {
    // passed defined player
    socket.on('host game', (player) => { 
        const game = new Game(player);
        console.log(game.getHost()); // still works here
        io.sockets.emit("game created", game);
    });

});

客户:

socket.on("game created", (game) => {
    const gameElement = document.createElement("li");
    gameElement.innerHTML = game.getHost(); // ERROR
    games.appendChild(gameElement);
});

在上面的标记线上,我得到了Uncaught TypeError: game.getHost is not a function

很抱歉,如果 socket.io 函数让它变得更加混乱,基本上只是当游戏从服务器传递到客户端时,它不再起作用了。
感谢您的帮助

【问题讨论】:

  • 如果你在“游戏创建”回调中记录游戏,你得到的输出是什么?
  • 你在客户端创建游戏实例吗?
  • 您不能将函数从服务器发送到客户端。类实例是 JSON 编码的,它删除了函数。

标签: javascript socket.io this function-binding


【解决方案1】:

问题是 socketio 正在为您序列化对象。由于 websocket 仍然只是 HTTP,因此您无法通过它发送实际的 JS 对象。 socketio 在后台使用JSON.stringify(game) 处理将您的对象序列化为 JSON。它还会在客户端将该 JSON 字符串转换回一个对象。

不幸的是,当您这样做时,您会丢失方法。例如:

let game = new Game({nickname: 'Bob Vance'});
game = JSON.stringify(game);
console.log(game) // will output {"player1":{"nickname":"Bob Vance"}}

您应该在控制台中看到{"player1":{"nickname":"Bob Vance"}},因为序列化为 JSON 会删除方法但保留属性。这只是正常的 JavaScript 行为。

因此,要恢复这些方法,您必须在客户端创建一个新的游戏实例,然后使用Object.assign() 重新构建对象。

例子

let serializedGame= JSON.parse(game);
let newGameInstance = new Game({nickname: game.nickname});
Object.assign(newGameInstance, serializedGame);

现在你应该可以打电话给newGameInstance.getHost()

【讨论】:

  • 谢谢!我自己不会想到这一点。这让我意识到我应该重新考虑我的服务器和客户端的结构。感谢您的帮助。
  • 没问题?很高兴能帮上忙!
猜你喜欢
  • 2019-08-22
  • 2021-12-31
  • 1970-01-01
  • 2013-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多