5

objのハンドラ関数で変数を取得するにはどうすればよいですか? MyClassのobjの参照なし。

    var obj = {
        func: function(){
            var myClass = new MyClass();
            myClass.handler = this.handler;
            myClass.play();        
        },

        handler: function(){
            //Here i don't have access to obj
            console.log(this); //MyClass
            console.log(this.variable); //undefined
        },

        variable:true
    };

    function MyClass(){
        this.play = function(){
            this.handler();
        };

        this.handler = function(){};
    };

    obj.func();

Base.js または別の同様の方法で oop を使用する場合は、それを構築する必要があります。

_.bindAll(obj) (アンダースコア メソッド) も適切ではありません。Base.js でのブレーク オーバーライドです。

4

5 に答える 5

2

変数を使用して元のコンテキストを参照します。

...
var self = this;
myClass.handler = function(){ self.handler(); };
...
于 2012-04-04T13:34:40.697 に答える
2

バインドのみのハンドラー メソッド: http://jsfiddle.net/uZN3e/1/

var obj = {
    variable:true,

    func: function(){
        var myClass = new MyClass();
        // notice Function.bind call here
        // you can use _.bind instead to make it compatible with legacy browsers
        myClass.handler = this.handler.bind(this);
        myClass.play();        
    },

    handler: function(){
        console.log(this.variable);
    }
};

function MyClass(){
    this.play = function(){
        this.handler();
    };

    this.handler = function(){};
};

obj.func();
​
于 2012-04-04T13:35:36.603 に答える
0

これをスコープ変数で宣言されたobjからの関数呼び出しを使用して解決します。

var obj = {
    func: function(){
        var self = this;
        var myClass = new MyClass();
        myClass.handler = function() { return this.handler.call(self); };
        myClass.play();        
    },

    handler: function(){
        //Here i don't have access to obj
        console.log(this); //MyClass
        console.log(this.variable); //undefined
    },

    variable:true
};
于 2012-04-04T13:38:03.897 に答える
0

これはMyClassコンストラクターのインスタンスであるmyClassにバインドされているため、 objにアクセスできません。ハンドラーこれを介してmyClassにアクセスし、objにアクセスする場合は、 obj名を直接使用する必要があります。

console.log(this); // myClass
console.log(obj.variable); // true

このバインドをobjにしたい場合は、JuanMelladoまたはgryzzlyが提案したものを使用してください。

于 2012-04-04T13:41:13.257 に答える
0

variableの前に宣言handler:

var obj = {
    variable: true, 

    func: function(){
        // ...       
    },

    handler: function(){
        console.log(this.variable); //true
    }
};
于 2012-04-04T13:22:56.390 に答える