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