3

Javascriptでメソッド呼び出しパターンを使おうとしています。関数をオブジェクトメンバーとして宣言します。

Javascript:The Good Partsによると、これにより、thisポインタが囲んでいるオブジェクトを参照するようになります。私が以前にこれを試したとき、これは事実でした。

以下のコードのサンプルではthis、​​単一のステートメントによるポインター参照は、オブジェクトではなく関数console.logを指しています。コードを再確認しましたが、正直なところ何が起こっているのかわかりません。

私はこれに別の目を使うことができました。私がここで見逃していることは本当に明白なことですか、それとも間違った行動を期待していますか?ありがとうございました。

編集:投稿したコードに誤りがありました(流動的です)。匿名関数内のキーワードはthat、ではなく、である必要がありthisます。修理済み。

ダブルエディット:モジュール内に残りのコードを追加しました。私はcommonJSモジュールを(使用しているgameJSライブラリに従って)作成しようとしています。それがどこで問題になるかはわかりませんが、問題があるのではないかと思います。これは何かを変えますか?

var gamejs = require('gamejs');
var system = require('app/system');

var input = {
    eval_keys: function () {
        console.log(this); // This should be the outer object, but shows the function!
        var that = this;
        gamejs.event.get().forEach(function (event) {
            if (event.type === gamejs.event.KEY_DOWN) {
                for (var key in that.keyconfig) {
                    if (that.keyconfig.hasOwnProperty(key)) {
                        if (event.key === gamejs.event[key]) {
                            that.keyconfig.key = true;
                        }
                    }
                }

                system.log("KEYDOWN", event.key);
            }

            if (event.type === gamejs.event.KEY_UP) {
                for (var key in that.keyconfig) {
                    if (that.keyconfig.hasOwnProperty(key)) {
                        if (event.key === gamejs.event[key]) {
                            that.keyconfig.key = false;
                        }
                    }
                }

                system.log("KEYUP", event.key);
            }

            return keyconfig;
        });
    },
    eval_mouse: function () {
/* in progress
        else if (event.type === gamejs.event.MOUSE_MOTION) {
            // if mouse is over display surface
            if (display.rect.collidePoint(event.pos)) {
                system.log("mousemove", testcoords);
                testcoords = event.pos;
            }
        }
*/
    },
    keyconfig: {
        K_UP: false,
        K_LEFT: false,
        K_RIGHT: false,
        K_DOWN: false
    }
};

exports.eval_keys = input.eval_keys;

Chromeの開発コンソールからの出力:

Object {eval_keys: function}
eval_keys: function () {
arguments: null
caller: null
length: 0
name: ""
prototype: Object
__proto__: function Empty() {}
<function scope>
__proto__: Object
4

3 に答える 3

1

オブジェクトが宣言された後に呼び出すことで、私にはうまくいくようです。input.eval_keys()

Object {eval_keys: function}また、コンソールに表示する出力は、必要な出力、つまりメソッドを含む外部オブジェクトであるように見えます。

問題は、次のように、そこで宣言した他のメソッドが表示されるはずであるということのようです。

Object {eval_keys: function, eval_mouse: function, keyconfig: Object}
eval_keys: function () {
eval_mouse: function () {
keyconfig: Object
__proto__: Object

したがって、私が知る限り、あなたの質問は「なぜこれらの他のメソッドがコンソールのオブジェクト内に表示されないのですか?」ということです。しかし、それを説明する可能性のあるコードで他に何をしているのか、関連するメソッドをいつどのように呼び出すのかはわかりません。

お役に立てれば。

于 2013-03-24T18:12:42.750 に答える
0

forEachそのループで無名関数を使用しなかった場合は機能します。thisキーワードの値は異なります。2番目のパラメーターで渡すことができます。

gamejs.event.get().forEach(function (event) {
    // this now refers to the outer this
}, this);

thatまたは、外部this値を参照する変数を使用することもできます。

于 2013-03-24T18:08:13.597 に答える
0

thisさて、私はポインタが1つの関数を持つオブジェクトのみを表示する原因を理解しました-それは次の行でした:

exports.eval_keys = input.eval_keys;

気まぐれで、追加するexports.keyconfig = input.keyconfigことにしました。それはオブジェクトの一部としてコンソールに表示されました。

ポインタが問題のモジュール内にある場合でも、exportsキーワードが参照されたときにポインタに対して何かを実行しているように見えます。それがどのように機能したかは正確にはわかりませんが、機能しました。thisthis

私はさらに多くの問題に直面していますが、現時点では、当面の問題は解決されています。これについてもう少し読む必要があります。

于 2013-03-24T19:23:36.987 に答える