这是一个普通的函数,一个构造函数还是两个都没有?

时间:2012-12-28 02:58:15

标签: javascript class object constructor jsdoc

我喜欢使用js。现在我很沮丧。我正在尝试jsDoc我的老板购买的大量代码。作者没有提供API,因此我将使用jsDoc创建一个API。

不幸的是代码不清楚,它在一个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(),不是对象的方法 FooA和FooB。

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

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

    感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

FooA和FooB是构造函数。

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

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

请参阅 http://javascript.crockford.com/private.html

答案 1 :(得分: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');
  }
}

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

我认为我不会将bar归类为一种方法。也许作为一种“私人功能”或“私人方法”更为贴切。

答案 2 :(得分:1)

看起来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}
}