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

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

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

有帮助吗?

解决方案

  

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

在执行操作之前,为每个文件名添加排序顺序值并按名称排序是否过于简单?

例如:

01_parent.js
02_child.js

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

如果无法确定javascript文件的编写方式,可以选择一些方法来处理问题。

其他提示

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

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

我想你可以像这样做一些真正的hackish:

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

该代码也可以在任何地方,并且会一直运行,直到 Parent Child 都被加载......但我不会这样做。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top