Coffeescript“命名空间”中的类

发布于 2024-12-25 00:43:58 字数 967 浏览 3 评论 0原文

我在 Coffeescript FAQ 上找到了这个用于创建简单命名空间的代码片段。

# 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

任何人都可以阐明实现此目的的语法吗?

I found this snippet on the Coffeescript FAQ for creating simplistic namespaces ..

# 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!'

That is all well and good, but I am having a great deal of trouble doing this with the class keyword. Such that ..

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

can anyone shed some light on the syntax that would accomplish this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

大姐,你呐 2025-01-01 00:43:58

更好的是,类语法允许名称实际上采用成员的形式,因此您实际上可以这样做:

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

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

完整的小提琴:http://jsfiddle.net/7Efgd/1/

Even better, the class syntax allows for the name to actually be in the form of a member, so you can actually just do:

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

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

Full fiddle here: http://jsfiddle.net/7Efgd/1/

风启觞 2025-01-01 00:43:58

诀窍是首先创建类

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()

The trick is to create the class first

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

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

Then somewhere near the end of the file export all the classes than need to be exposed.

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

Later on you can use the classes as so:

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

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

secondClass.myFunc()
阳光的暖冬 2025-01-01 00:43:58

使用这样的东西怎么样?

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

    Hello2: class Hello2 extends Backbone.View
        constructor: ->
            @message = 'Hello2'

How about using something like this?

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

    Hello2: class Hello2 extends Backbone.View
        constructor: ->
            @message = 'Hello2'
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文