代码之家  ›  专栏  ›  技术社区  ›  Clutch

混淆的Javascript类声明

  •  2
  • Clutch  · 技术社区  · 15 年前

    FOO = function() {
       ...functions() ... 
       return { hash }
    }();
    

    它正在按设计工作,但我被它搞糊涂了。有人能定义这个结构在做什么吗?创建类只是一种奇怪的方式吗?

    5 回复  |  直到 15 年前
        1
  •  5
  •   brainjam    15 年前

    这是一种使用闭包的技术。这个成语是众所周知的,但当你第一眼看到它时,就会感到困惑。 FOO { hash } .

    function bar() {
       ...functions() ... 
       return { hash }
    };
    
    FOO = bar();
    

    所以FOO等于 {散列} . 这样做的好处是 hash function() . 没有其他人可以访问,所以这些东西基本上是私人的。

    谷歌'Javascript关闭'了解更多。

        2
  •  1
  •   BnWasteland    15 年前

    Js本身并没有真正的类,而是“原型”。这意味着在正常类型安全的意义上,没有两个对象是同一个“类型”的,您可以动态地将成员添加到一个实例中,而不影响另一个实例(这就是他们所做的)。

    dougcrockford的Javascript:好的部分是快速阅读,也是我遇到的js中OOP的最佳介绍。

        3
  •  0
  •   noah    15 年前

    那实际上不是一个类,只是一个对象。我建议您阅读以下内容: http://javascript.crockford.com/survey.html

    因为JavaScript没有块作用域,所以您的选择(主要)是让所有变量驻留在全局或函数作用域中。代码段的作者想要声明一些他不想在全局范围内的局部变量,因此他声明了一个匿名函数并立即执行它,返回他试图创建的对象。这样所有变量都将在函数的作用域中。

        4
  •  0
  •   Bob    15 年前

    Module Pattern ,这基本上是一种在使用私有变量和函数的同时拥有单个对象实例(Singleton)的方法。

    hash ,如果它本身是一个对象或函数,则可以访问该匿名单例对象中声明的所有变量。

        5
  •  0
  •   Russ Cam    15 年前

    您缺少一个开放的parens,但它基本上是一种通常在对象中隐藏信息的方法,即设置私有和私有方法的方法。

    例如

    var foo = (function() {
       /* function declarations */
       return { /* expose only those functions you 
                   want to expose in a returned object 
                */ 
              }
    })();
    

    Private Members in JavaScript . 这基本上就是你所看到的模式,但在一个稍微不同的伪装。函数声明被包装在一个自调用的匿名函数中——一个在声明后立即执行的匿名函数。由于其中的函数的作用域是匿名函数,因此在匿名函数执行后,它们将无法访问,除非它们通过在匿名函数执行返回的对象中引用它们而创建的闭包公开。

    它通常被称为 the Module Pattern