无法设置undefined的属性

时间:2015-01-26 17:43:34

标签: javascript jquery requirejs

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

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似乎是我定义的,如构造函数所示。有人有什么想法吗?

由于

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

Websocket的构造函数和实例之间存在脱节,这导致了您的问题。

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

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

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