2

在开发 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,如果连接脚本将子代码放在父代码之前,则可能不会发生这种情况。

有没有办法编写此代码以使功能相同,但编写代码的顺序不再重要?

编辑:我忘记了我也在使用命名空间,所以我也将它添加到代码中,这可能会改变一些事情。

4

4 回答 4

3

当我处理大型应用程序时,我使用requireJS将我的代码划分为模块,并确保以正确的顺序加载这些模块。然后我只是将我的派生类标记为依赖于父类。

RequireJS 附带了一个工具,可以组合和缩小所有模块以进行生产部署。

于 2011-04-05T01:27:14.800 回答
2

如果我使用的连接脚本只是连接一个充满文件的目录,则子类可能出现在父类之前的代码中。

为每个文件名添加排序顺序值并在执行操作之前按名称排序是不是太简单了?

例如:

01_parent.js
02_child.js

否则,可能会在单独的文件中维护预先排序的文件列表。甚至可能更进一步,并在 xml 中提供分层依赖结构来解析?这可能有点过度设计解决方案:-D

如果您无法确定 javascript 文件的编写方式,则可以选择一些解决问题的方法。

于 2008-11-10T22:52:07.737 回答
0

我想你可以做一些像这样非常骇人听闻的事情:

setTimeout(function() { 
  if(typeof(Parent) != "undefined" && typeof(Child) != "undefined") { 
    Child.prototype = new Parent(); 
  } else {
    setTimeout(arguments.callee, 50);
  }
}, 50);

该代码也可以在任何地方,并且会持续运行直到加载ParentChild加载......但我不会那样做。

就个人而言,我只是确保您的文件以正确的顺序组合。

于 2008-11-10T23:00:07.767 回答
0

如果对象是“命名空间的”,那么您要么必须切换到包含按顺序连接的构建解决方案,要么使用类似dojo.require的东西(但显然不是特定于 dojo 的)。基本上,您需要一个框架,它可以让您检查给定标识符是否可用,如果不可用,则暂停执行并包含它(通过评估的 ajax 或插入的脚本标签)。

于 2008-11-10T23:18:16.047 回答