我有一个非常复杂的问题:我正在制作像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:对象#的属性'help'不是函数
这是我执行我的功能的方式:
mainData.openedApps[0].command_list["help"]().app();
我有另一个类,与此类似,我粘贴在这里,除了我不保留变量。 我执行它就像:
_global_commands().command_list["command"]().app();
这样可以正常工作,所以我认为将类保留在var中是个问题。但我真的不知道我做错了什么。
答案 0 :(得分: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所做的一些基准测试,继承也比查看实例更快。)