首页 > 解决方案 > TypeError:“方法”不是函数

问题描述

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

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

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

播放器.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

应用程序.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()
})

谢谢你的帮助

标签: javascriptnode.jses6-class

解决方案


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

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

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


推荐阅读