【问题标题】:Is this an ordinay function, a constructor or neither?这是普通函数,构造函数还是两者都不是?
【发布时间】:2012-12-13 09:30:32
【问题描述】:

我以前喜欢使用 js。现在我只是沮丧。我正在尝试对我老板购买的大量代码进行 jsDoc 处理。作者没有提供 API,所以我将使用 jsDoc 创建一个。

不幸的是,代码不清晰,一个js文件中包含大约10k行代码。我过去使用过对象文字,这不是对象文字。参数和函数不使用逗号分隔。此外,从不使用原型,但使用新运算符。我看过几本书,命名空间似乎是最接近的“风格”。这是程序的一般流程。我的问题遵循示例。

(function () {
var global = (function () {return this; } ).call();
global.X = {};
})();

X.init = function(){
    X.MyObjectA = new X.FooA();
    X.MyObjectB = new X.FooB();
}

X.FooA = function() {
   var storeStuff;
   do stuff
   .
   .
   function bar(){
        var storeSomething;
        do something
        do somthing else
        .
        .
        moreFunctions(){}
        var moreVars;
        .
        .

    }

    this.anOccasionalFunctionLiteral = function(){}
        .
        .
}

X.FooB = function(){
    Similar contents of FooB()
 }
 .
 .
 .
 Continues forever...

所以我的问题是:

  1. 这是什么风格!?当我说风格时,我想我的意思是 FooA 和 FooB 是什么?他们是对象吗?上课?

  2. 如果嵌套函数不是 X.FooA 或 X.FooB 的成员,我应该给嵌套函数起什么标题。有人告诉我嵌套函数,包括 bar(),不是 objects FooA 和 FooB 的方法。

  3. 如果嵌套在 object 中的函数实际上不是其周围对象的方法,是否可以从任何地方调用它?还是适用正常范围规则?

为了让生活更加可读和快乐,我一直将类似于 FooA 和 FooB 的 对象 归类为构造函数,并将构造函数中的任何方法(例如 bar())归类为 FooA 和 FooB 的方法。这可能不正确,但至少它是有组织的。有什么建议吗?

感谢您的帮助!

【问题讨论】:

    标签: javascript class object constructor jsdoc


    【解决方案1】:

    1) 我认为您的命名空间直觉是正确的。第一个自执行匿名函数获得全局命名空间。他们可能没有做一些简单的事情,比如:

    window.X = {};
    

    因为这在“window”不是全局对象的环境中不起作用。 (就像服务器上的nodejs)

    2) 我不会调用这些方法。就个人而言,我认为这取决于这些功能的实际功能是什么。它们可以充当对象的更多名称空间或构造函数。如果它们是大写的,作者可能更多地将它们视为命名空间或类,而不是方法。

    3) bar() 函数只能从 X.FooA 中调用,但是请注意,它可以在 X.FooA 实际声明之前调用

    X.FooA = function() {
      bar(); // this will work
      function bar() {
        alert('this will work');
      }
    }
    

    这是因为在评估代码时,函数声明将被提升到周围函数的顶部。但是,bar 函数在 X.FooA 之外不可用。

    我不认为我会将 bar 归类为一种方法。也许作为“私有函数”或“私有方法”会更合适。

    【讨论】:

      【解决方案2】:

      FooA 和 FooB 是构造函数。

      嵌套函数是“私有”函数。

      FooA内部的bar函数只能在FooA内部调用。

      http://javascript.crockford.com/private.html

      【讨论】:

        【解决方案3】:

        看起来 FooA 和 FooB 是包含在“X”对象中的类。定义类中的匿名函数本质上是私有方法,而命名函数是包含类的公共方法。

        var x = {
         classA:function(){
          do class constructor stuff...
          function myPrivateMethod(){do stuff...}
          this.myPublicMethod = function(){do stuff...}
         },
         classB:{another class contained in the object}
        }
        

        【讨论】:

          猜你喜欢
          • 2019-06-10
          • 1970-01-01
          • 1970-01-01
          • 2012-06-02
          • 2021-06-12
          • 2015-06-15
          • 2019-02-24
          • 2013-06-12
          • 1970-01-01
          相关资源
          最近更新 更多