0

我有一个非常复杂的问题:我正在制作像 linux 终端一样工作的应用程序。所以我输入命令和应用程序做一些事情。这是我的一门课:

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:对象#的属性“帮助”不是函数

这就是我执行我的功能的方式:

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

我有另一个类,与我在这里粘贴的非常相似,只是我没有将它保存在变量中。我像这样执行它:

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

这很好用,所以我认为这是将我的课程保持在 var 中的问题。但我真的不知道我做错了什么。

4

1 回答 1

1

你有一些特点。首先,为什么help每次调用时都重新声明它的方法,而不是一次?

有几种方法可以做到这一点。一,下面,解决你的问题。

"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 回答