Классы в пространстве имен Coffeescript
Я нашел этот фрагмент в 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
может ли кто-нибудь пролить свет на синтаксис, который выполнит это?
Ответы
Ответ 1
Фокус в том, чтобы сначала создать класс
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()
Ответ 2
Еще лучше, синтаксис класса позволяет фактически иметь имя в форме члена, поэтому вы можете просто сделать:
namespace 'Secrets', (exports) ->
class exports.Hello
constructor: ->
@message = "Secret Hello!"
a = new Secrets.Hello
console.log a.message
Полная скрипка здесь: http://jsfiddle.net/7Efgd/1/
Ответ 3
Как насчет использования чего-то подобного?
module =
Hello: class Hello extends Backbone.Model
constructor: ->
@message = 'Hello'
Hello2: class Hello2 extends Backbone.View
constructor: ->
@message = 'Hello2'