在WebSocket对象中调用类方法

时间:2013-09-27 09:17:49

标签: javascript websocket this

我有一个班级Gadget,其中一个方法consider定义为:

function Gadget() {

    this.consider = function (arg) {
        alert(arg);
    };

    if ("WebSocket" in window) {
        var ws = new WebSocket(...);
        // the rest truncated

        ws.onmessage = function (evt) {
            consider(evt.data);
        };
    }
}

但是,由于consider失败,我无法让TypeError工作。

Uncaught TypeError: Object #<Gadget> has no method 'consider'

如果我尝试使用this.consider,则TypeError会出现在 WebSocket 对象中。如果我尝试parent.consider,那么 Object 对象会给我同样的错误。

现在我的解决方法是使用声明的实例中的方法,如:

var player = new Gadget();

并改为使用player.consider(evt.data)。我不喜欢这样做,但它有效。如何重新排列代码,使其不依赖于对象的已定义实例?

1 个答案:

答案 0 :(得分:3)

有两种方法可以解决这个问题。

1)使用私人功能

function Gadget() {

    function consider(arg){
        alert(arg);
    }

    this.consider = consider;

    if ("WebSocket" in window) {
        var ws = new WebSocket(...);
        // the rest truncated

        ws.onmessage = function (evt) {
            consider(evt.data);
        };
    }
}

这样,您在consider()类中有一个私有的Gadget函数,即使它的实例调整了自己的consider方法(例如var x=new Gadget(); x.consider=...),网络套接字仍然可以按预期工作;

2)“缓存”this

function Gadget() {
    this.consider = function(arg){
        alert(arg);
    };

    if ("WebSocket" in window) {
        var ws = new WebSocket(...);
        // the rest truncated

        var self=this;
        ws.onmessage = function (evt) {
            self.consider(evt.data);
        };
    }
}

这样,您的Web套接字事件将始终使用小工具的实例{/ 1}}。

Here is a jsfiddle demo展示了这两种方式。请注意,我故意调整了consider 实例的consider方法(第二个按钮)。单击这些按钮以查看不同的内容。