2011-05-24 10 views
14

Excavando en Coffeescript Estoy tratando de portar mis archivos Javascript a Coffeescript.Patrón de módulo en Coffeescript con variables ocultas

En cuanto a esto, tengo una pregunta relacionada con el patrón módulo de Doulgas Crockford (cierre de unión con el fin de mantener las variables "privado")

Por lo tanto, mi pregunta es: ¿Cómo sería el aquivalent CoffeeScript para el siguiente aspecto JS como:

var test = function() { var hidden = 'open'; return { open: hidden }; }(); 

Respectivamente, ¿hay un enfoque diferente/mejor para este patrón en Coffeescript?

Respuesta

17

creo que el mejor enfoque consiste en traducir literalmente, tu ejemplo en CoffeeScript, con la ayuda de la palabra clave do (que existe principalmente para capturar los valores en los bucles-ver a mi PragPub article):

test = do -> 
    hidden = 'open' 
    open: hidden 

Esto compila a

var test; 
test = (function() { 
    var hidden; 
    hidden = 'open'; 
    return { 
    open: hidden 
    }; 
})(); 

que es idéntico al código que no sea formateo (El compilador de CoffeeScript coloca automáticamente todas las declaraciones var en la parte superior de su alcance, lo que facilita la determinación del alcance de una variable mirando la salida de JavaScript.)

+0

"que existe principalmente para capturar valores en bucles" matyr

+0

Matyr, ¿puedes explicar eso? La palabra clave do parece que captura valores en un ámbito local para mí. – Geoff

+0

@matyr No fue el propósito de 'do' cuando inicialmente lo propusiste, pero ciertamente es la razón por la cual Jeremy (de mala gana) lo agregó a CoffeeScript. Ver [problema 959] (https://github.com/jashkenas/coffee-script/issues/959). También es el único contexto en el que 'do' aparece en [documentos oficiales] (http://jashkenas.github.com/coffee-script/#loops). –

6

Agregué una sección a la wiki de coffeescript sobre cómo manejar el espacio de nombres Es bastante elegentPackage (creo)

https://github.com/jashkenas/coffee-script/wiki/Easy-modules-with-coffeescript

CoffeeScript no tiene un sistema de módulo nativo por encima de la de rodear todos los archivos de código fuente en una función anónima. Sin embargo, con un truco simple puedes tener módulos que son la envidia de Ruby. defino mis módulos como el de abajo

@module "foo", -> 
    @module "bar", -> 
     class @Amazing 
      toString: "ain't it" 

La implementación del módulo de ayudante es

window.module = (name, fn)-> 
    if not @[name]? 
    this[name] = {} 
    if not @[name].module? 
    @[name].module = window.module 
    fn.apply(this[name], []) 

que puede poner en otro archivo de origen si lo desea. A continuación, puede acceder a sus clases por módulos de espacios de nombres

x = new foo.bar.Amazing 

WRT a su problema Creo que el jazmín continuación spec responder a ella usando mi sistema de módulos

@module "test", -> 
    hidden = 10 
    @open = hidden 

describe "test", -> 
    it "has no hidden", -> 
    expect(test.hidden?).toEqual false 

    it "has open", -> 
    expect(test.open?).toEqual true 
+1

Esa página Wiki (https://github.com/jashkenas/coffee-script/wiki/Easy-modules-with-coffeescript) no parece existir. –

1

Si usted puede escribir su módulo en una sola clase, luego compilar el coffeescript con la opción -b creará naturalmente el patrón de módulo que está buscando.

Este:

class test 
    hidden = 'open' 
    open: hidden 

compila a esto:

var test; 
test = (function() { 
    var hidden; 
    hidden = 'open'; 

    test.prototype.open = hidden; 

    return test; 
})(); 

que es casi lo que busca.

Cuestiones relacionadas