Классы в Coffeescript 'Пространство имен' - PullRequest
14 голосов
/ 04 января 2012

Я нашел этот фрагмент в FAQ по Coffeescript для создания упрощенных пространств имен.

# Code:
#
namespace = (target, name, block) ->
  [target, name, block] = [(if typeof exports isnt 'undefined' then exports else window), arguments...] if arguments.length < 3
  top    = target
  target = target[item] or= {} for item in name.split '.'
  block target, top

# Usage:
#
namespace 'Hello.World', (exports) ->
  # `exports` is where you attach namespace members
  exports.hi = -> console.log 'Hi World!'

namespace 'Say.Hello', (exports, top) ->
  # `top` is a reference to the main namespace
  exports.fn = -> top.Hello.World.hi()

Say.Hello.fn()  # prints 'Hi World!'

Это все хорошо, но у меня большие проблемы с этим ключевым словом class. Такой, что ..

namespace 'Project.Something', (exports) ->
   exports.something = -> class something
    // .. code here
   exports.somethingElse = class somethingElse extends something

Может ли кто-нибудь пролить свет на синтаксис, который это сделает?

Ответы [ 3 ]

24 голосов
/ 14 января 2012

Более того, синтаксис класса позволяет имени фактически иметь форму члена, так что вы можете просто сделать:

namespace 'Secrets', (exports) ->
  class exports.Hello
    constructor: ->
      @message = "Secret Hello!"

a = new Secrets.Hello
console.log a.message

Полная скрипка здесь: http://jsfiddle.net/7Efgd/1/

19 голосов
/ 04 января 2012

Хитрость заключается в том, чтобы сначала создать класс

class MyFirstClass
  myFunc: () ->
    console.log 'works'

class MySecondClass
  constructor: (@options = {}) ->
  myFunc: () ->
    console.log 'works too'
    console.log @options

Затем где-нибудь ближе к концу файла экспортировать все классы, которые необходимо предоставить.

namespace "Project.Something", (exports) ->
  exports.MyFirstClass = MyFirstClass
  exports.MySecondClass = MySecondClass

Позже выможно использовать классы так:

var firstClass = new Project.Something.MyFirstClass()
firstClass.myFunc()

var secondClass = new Project.Something.MySecondClass 
  someVar: 'Hello World!'

secondClass.myFunc()
1 голос
/ 14 февраля 2013

Как насчет использования чего-то подобного?

module =
    Hello: class Hello extends Backbone.Model
        constructor: ->
            @message = 'Hello'

    Hello2: class Hello2 extends Backbone.View
        constructor: ->
            @message = 'Hello2'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...