1

次のように定義されGadgetた1つのメソッドを持つクラスがあります。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代わりに使用しようとすると、 WebSocketオブジェクトTypeErrorで発生します。を試してみると、Objectオブジェクトで同じエラーが発生します。parent.consider

現在、私の回避策は、次のように、宣言されたインスタンスからメソッドを使用することです。

var player = new Gadget();

player.consider(evt.data)代わりに。私はこれをするのが好きではありませんが、うまくいきます。オブジェクトの定義されたインスタンスに依存しないようにコードを再配置するにはどうすればよいですか?

4

1 に答える 1

3

Two ways you can overcome this.

1) Use private function

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);
        };
    }
}

This way you have a private consider() function inside your Gadget class, that even if the instance of it tempered its own consider method (e.g. var x=new Gadget(); x.consider=...), the web socket will still work as you intended;

2) "Cache" 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);
        };
    }
}

This way your web socket event will always use whatever the instance of Gadget want consider to be.

Here is a jsfiddle demo that demonstrate these two ways. Notice that I intentionally tempered the consider method of the instance of Gadget2 (the second button). Click those buttons to see the different.

于 2013-09-27T10:03:11.683 に答える