代码之家  ›  专栏  ›  技术社区  ›  Matt Ephraim

如何利用原型继承而不需要按特定顺序包含文件?

  •  2
  • Matt Ephraim  · 技术社区  · 17 年前

    这种方法通常是有效的,但我开始遇到原型继承的问题。特别是,如果一个类从另一个类继承,则需要已经包含父类的文件,以便继承工作。如果我使用的连接脚本只是连接一个满是文件的目录,那么子类可能出现在父类之前的代码中。这样地:

    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();
    

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

    编辑:我忘了我也在使用名称空间,所以我也在代码中添加了名称空间,这可能会稍微改变一些情况。

    4 回复  |  直到 16 年前
        1
  •  3
  •   Sean McMillan    15 年前

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

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

        2
  •  2
  •   mercutio    17 年前

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

    如:

    01_parent.js
    02_child.js
    

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

        3
  •  0
  •   Jason Bunting    17 年前

    我想你可以做一些像这样的粗俗的事情:

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

    该代码也可以在任何地方,并将持续运行,直到 Parent Child 有子弹……但我不会那么做。

        4
  •  0
  •   FriendOfFuture    17 年前

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

    推荐文章