0

私は非常に複雑な問題を抱えています: Linux 端末のように動作するアプリを作成しています。だから私はコマンドを入力し、アプリは何かをします。これは私のクラスの1つです:

function _console() {
    this.name = "console";
    this.command_list = {
        "help": function () {
            this.app = function () {
                write("Sorry, no commands so far ;P");
                return this;
            };
            this.help = "type to get help";
            return this;
        }
    };

    this.start = function () {
        write("Hi :)");
    };

    return this;
};

このクラスを配列に保持します。

var mainData = {
    openedApps: new Array(new _console()),
};

問題は、「ヘルプ」機能の最初の使用が正常に機能することです。しかし、もう一度入力するとエラーが表示されます:

TypeError: オブジェクト # のプロパティ 'help' は関数ではありません

これは私が私の機能を実行する方法です:

mainData.openedApps[0].command_list["help"]().app();

ここに貼り付けたものと非常によく似た別のクラスがありますが、変数に保持していません。私はそれを次のように実行します:

_global_commands().command_list["command"]().app();

これは問題なく動作するので、これはクラスを var 内に保持することに問題があると思います。しかし、私は自分が何を間違えたのか本当にわかりません。

4

1 に答える 1

1

あなたにはいくつかの特徴があります。まず、一help度だけではなく、呼び出されるたびに のメソッドを再宣言するのはなぜですか?

これを行うにはいくつかの方法があります。以下の1つは、問題を解決します。

"help": function() {
    this.app = this.app || function(){
        write("Sorry, no commands so far ;P");
        return this;
    };
    this.help = this.help || "type to get help";
    return this;
}

さらに、コンストラクター内ではなく、プロトタイプでメソッドを宣言することを検討する必要があります。あなたのユースケースでは、これは目に見える問題ではないかもしれませんが、その結果、あなたのメソッドはインスタンスのメソッドであり、クラスの継承可能なメソッドではありません。(jQuery の創設者である John Resig が行ったいくつかのベンチマーク テストによると、継承はインスタンスを検索するよりも高速です)。

于 2013-09-01T11:55:58.753 に答える