TypeError:“方法”不是函数

时间:2019-08-26 22:01:46

标签: javascript node.js es6-class

我目前正在尝试在NodeJS中开发一个小型游戏来学习ES6。 我使用新语法创建了一个“ Player”对象。静态功能完美运行。但是,调用其方法将引发TypeError

  

(例如:TypeError:socket.handshake.session.player.joinRoom不是函数)。

我不明白为什么,因为我做了一些教程中看到的相同的事情。由于joinRoom是一个setter,因此我尝试在声明之前添加“ set”,但遇到了同样的问题。这是我的代码

Player.js

class Player{
    constructor(name){
        this.id = Player.setID()
        this.name = name
        this.currentRoom = ""
        this.isOwner = false
        this.cards = {}

        Player.list[this.id] = this
    }

    joinRoom(code){
        this.currentRoom = code
    }
    makeOwner(){
        this.isOwner = true
    }
    static setID(){
        if(Player.list.length === 0){
            return 1
        }else{
            return Player.list[Player.list.length - 1].id + 1
        }
    }
}

Player.list = []

module.exports = Player

app.js

// socket.handshake.session.player is initialized with "new Player(playerName)" 
socket.on("creatingroom", function(maxPlayers){
    console.log(socket.handshake.session.player)
    // Returns {id: 1, name: 'chosenName', currentRoom: '', isOwner: false, cards: {}}
    var room = new Room(maxPlayers)
    socket.handshake.session.player.joinRoom(room.code)
    socket.handshake.session.player.makeOwner()
})

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

虽然您正在使用的对象似乎具有播放器的所有属性,但看起来它似乎不是从Player类继承的。您可以通过该对象创建一个新的Player:

const player = Object.assign(new Player('Name'), socket.handshake.session.player);
player.joinRoom(12);
player.makeOwner();
console.log(player);

现在player是一个真实的Player实例,您现在可以在其上调用方法了。