Yabble.jsが原因であると想定しなければならない非常に奇妙な問題があります。私はこれまでYabble.jsを使用したことがなく、現在使用している唯一の理由は、使用しているライブラリ(Gamejs)の依存関係であるためですが、これが発生する理由と、実際にYabbleであるかどうかを理解したいと思います。 jsのせい、あるいはGamejsのせい。
これが私のmain.jsの非常に圧縮された(そして一般性のために修正された)バージョンです:
var gamejs = require('gamejs');
...
function Character(/*lots of arguments*/) {
Character.superConstructor.apply(this, arguments);
this.somethingtomakeitaprototypeforthisexample = oneofthearguments;
}
gamejs.utils.objects.extend(Character, gamejs.sprite.Sprite);
Character.prototype.draw = function(display){
display.blit(this.animator.image, this.pos);
}
... /*Skipping most of the file, irrelevant to the problem*/
function main() {
maincharacter = new Character(/* appropriate number and types of arguments */);
... /*skipping the rest*/
}
gamejs.ready(main);
main
関数に問題なく入り、への呼び出しでブレークが発生することを知るのに十分なデバッグを行いましたCharacter
。(Chromeのコンソールからの)エラーメッセージは次のとおりです。
Uncaught TypeError: undefined is not a function
main
_readyResources
Character
それが未定義の関数であると判断しました。ただし、このように準備完了関数を定義すると、次のようになります。
gamejs.ready(function(){
console.log('Character:');
console.log(Character);
main();
});
適切に定義されているように、の全内容がCharacter
出力されますが、それでもエラーが発生しmain
ます。したがって、それが呼び出されるCharacter
前に名前空間によって定義されていることを私は知っています。main
面白い事実:私には回避策があります。関数プロトタイプを次のように変更した場合main
:
function main(CharacterClass) {...};
次に、ready関数を次のように変更します。
gamejs.ready(function(){ main(Character); });
関連する行を次のように変更しますmain
。
var character = new CharacterClass(...);
それはうまくいきます。しかし、これは本当にハックな感じがします。
ですから、私の質問は、すでにそれを持っているので、それをどのように機能させるかではなく、なぜそれが問題であるのか、そしてそれを想定どおりに機能させる方法です。
何かご意見は?