无法设置未定义的属性

Cannot set property of undefined

本文关键字:属性 未定义 设置      更新时间:2023-09-26

我有一个javascript类,它正在使用requirejs我创建了一个构造函数来创建它的实例,方法如下

define(function() {
    function Websocket(socket) {
        this.socket = socket;
        this.ws = new Websocket('ws://localhost:'.concat(socket));
        this.ws.binaryType = 'arraybuffer';
    }
    // WebSocket event handlers
    Websocket.ws.onopen = function () {
        console.log("Open");
        // Sends a JSON encoded message
        Websocket.ws.sendcmd("sum",2,3);
    };

    return Websocket
});

但是每当我这样做时,我都会Uncaught TypeError: Cannot set property 'onopen' of undefined.我不确定问题是什么,因为 Websocket 对我来说似乎是定义的,如构造函数所示。有人有什么想法吗?

谢谢

构造函数和 Websocket 实例之间存在断开连接,这导致了您的问题。

如果要分配给特定Websocketws,则需要在创建Websocket和相应的ws后执行此操作。这通常在构造函数中,在您分配this.ws之后。

但是,在您的示例中,Websocket构造函数是递归的,应该会导致堆栈溢出。每次创建套接字时,都会在其中创建另一个套接字,从而形成无限深的套接字树。这可能不是你想要的,我建议将你的Websocket函数(/constructor)重命名为具有唯一名称(可能是SocketWrapper)的东西。

如果希望所有Websocket都具有onopen属性,则应使用 Websocket.prototype.onopen 语法。这将创建(并分配)一个属性给Websocket的原型,因此所有new Websocket都将具有该属性。情况似乎并非如此。

会收到该错误ws因为它不是Websocket构造函数的属性。在构造函数中,您需要this.ws.onopen = funciton() { ... }