HTML5ゲームの作成を簡単にするはずの友達とJavaScriptライブラリを構築しています(ただし、これは本当に楽しみのためです)。問題が発生しているコードは次のとおりです。
/* Calls f on all the elems of the list that pass p and implement f */
var apply = function (f, p, list) {
for (var i in list) {
if (p(list[i]) === true && list[i][f] != undefined && typeof list[i][f] === 'function') {
list[i][f]();
}
}
};
this.draw = function(p) {
apply(moveView, p, this.views);
};
ユーザーはthis.draw関数を呼び出し、それに述語を渡します。apply関数に渡される関数moveViewは、views配列内のすべてのオブジェクトがそれを実装した場合にのみ実行されます。
しかし、私のコンソールは「moveViewが定義されていません」というエラーをスローしています。これは理にかなっています。apply関数を呼び出した時点で、moveViewが存在するかどうかをインタープリターにチェックさせたくありません。単にそれを渡して、適用されている各オブジェクトがその関数を実装しているかどうかをチェックできるようにします。apply likeを呼び出すとうまくいくと思いapply("draw", p, this.views);
ましたが、apply関数では、fは関数ではなく、文字列であるため、うまくいきませんでした。ジェネリック関数名をapply関数に渡して、そこですべてのチェックを実行できるようにしたいだけです。
私のすべてのコードは私のGithubにあります。
編集:
/*View object*/
var View = (function(){
var constr = function(f, o, i){
this.frame = utility.checkFrame(f);
this.orient = utility.checkOrientation(o);
/*user identification string*/
this.id = i;
this.moveView = function(){
console.log("testing");
};
};
return constr;
}());