在开发JavaScript时,我倾向于将JavaScript代码分离到不同的文件中,然后运行脚本来连接文件并压缩或打包生成的文件。最后,我有一个文件需要包含在我的生产网站上。
这种方法通常有效,但我开始遇到原型继承问题。具体来说,如果一个类继承自另一个类,则需要包含父类的文件以使继承工作。如果我正在使用的串联脚本只是连接一个充满文件的目录,则子类可能出现在父类之前的代码中。像这样:
parent_class.js
var Namespace = Namespace || {};
Namespace.Parent = function () { };
Namespace.Parent.prototype.doStuff = function () { ... };
child_class.js
var NameSpace = Namespace || {};
Namespace.Child = function () { ... };
Namespace.Child.prototype = new Namespace.Parent();
这种方法的唯一方法是在child_class.js之前包含parent_class.js,如果连接脚本将子代码放在父代码之前,则可能不会发生这种情况。
是否有办法编写此代码以使功能相同,但编写代码的顺序不再重要?
编辑:我忘了我也在使用命名空间,所以我也将它添加到代码中,这可能会改变一些东西。
答案 0 :(得分:3)
当我处理大型应用程序时,我使用requireJS将我的代码划分为模块,并确保以正确的顺序加载这些模块。然后我只是根据父类标记我的派生类。
RequireJS附带了一个工具,可以组合和缩小所有模块以进行生产部署。
答案 1 :(得分:2)
如果我正在使用的串联脚本只是连接一个充满文件的目录,则子类可能出现在父类之前的代码中。
在执行操作之前,为每个文件名添加排序顺序值并按名称排序是否过于简单?
例如:
01_parent.js
02_child.js
否则,可能在单独的文件中维护预订的文件列表。甚至可能更进一步,在xml中提供分层依赖结构来解析?这可能会使解决方案过度设计:-D
如果无法确定javascript文件的编写方式,可以选择一些方法来处理问题。
答案 2 :(得分:0)
我想你可以像这样做一些真正的hackish:
setTimeout(function() {
if(typeof(Parent) != "undefined" && typeof(Child) != "undefined") {
Child.prototype = new Parent();
} else {
setTimeout(arguments.callee, 50);
}
}, 50);
该代码也可能在任何地方,并且会一直运行,直到Parent
和Child
都被加载......但我不会这样做。
就个人而言,我只是确保您的文件以正确的顺序组合。
答案 3 :(得分:0)
如果对象是“命名空间”,那么您必须切换到包含顺序连接的构建解决方案或使用dojo.require之类的东西(但显然不是dojo特定的)。基本上你需要一个框架,它能够让你检查给定的标识符是否可用并暂停执行并包含它(如果不是,则通过evaled ajax或插入的脚本标记)。