Javascript 定义一个在CoffeeScript中创建新函数的类

Javascript 定义一个在CoffeeScript中创建新函数的类,javascript,class,coffeescript,Javascript,Class,Coffeescript,我想使用“class”语法创建一个类,当它通知一个实例时,该实例可以直接用作函数 class Foo constructor: (@bar) -> baz: -> console.log 'baz' ... f = new Foo 'bar' f() # runs () -> console.log @bar f.baz() # 'baz' 下面是一个示例,但我无法使用类语法在CoffeeScript中重现它。类似这样的示例如何: class Foo

我想使用“class”语法创建一个类,当它通知一个实例时,该实例可以直接用作函数

class Foo
  constructor: (@bar) ->
  baz: ->
    console.log 'baz'
  ...

f = new Foo 'bar'
f() # runs () -> console.log @bar
f.baz() # 'baz'

下面是一个示例,但我无法使用类语法在CoffeeScript中重现它。

类似这样的示例如何:

class Foo
  constructor: (@bar) ->
    return => console.log @bar

f = new Foo 'bar'
f()

我不认为您可以编写一个Coffeescript类来编译Javascript(或类似的东西)。Coffeescript
class
坚持两点:

它以
返回AwesomeObject结束类主体

如果我在类主体中放置了一个
返回条
,它将使用
错误来创建对象:类主体不能包含纯语句

链接的Javascript模型是:

var AwesomeObject = (function() {
    var AwesomeObject = function() {...};
    ...
    return function() {
      var o = new AwesomeObject();
      ...};
})();
它在内部定义一个
AwesomeObject
构造函数,但返回一个不同的函数。如果将内部名称更改为
AwesomeObject1
,则更清晰。它的功能相同,但无法直接访问
AwesomeObject1

另外
AwesomeObject()
newawesomeobject()
返回相同的内容

{ [Function]
  whatstuff: 'really awesome',
  doStuff: [Function] }
编译的Coffeescript(用于
类AwesomeObject…
)为:

AwesomeObject = (function() {
  function AwesomeObject() {...}
  ...
  return AwesomeObject;
})();
附言。
关于
new Foo()
Foo()
语法的Coffeescript问题讨论。大家一致认为,虽然Javascript中允许对
日期
等对象进行
新的less
调用,但不鼓励用户定义类。这很有趣,但与这里的问题并不相关。

这就是您要寻找的:

class Foo
  constructor: (@bar) ->
    f = -> console.log bar
    for v, k of @
      f[v] = k
    return f
  baz: ->
    console.log 'baz'

f = new Foo 'bar'
f() # runs () -> console.log @bar
f.baz() # 'baz'
请注意,此解决方案不会返回继承自
Foo.prototype
()的可调用对象,而是返回混合了某些属性的
函数
对象


更好的模式不是返回可调用的函数对象,而是返回具有
调用
执行
方法的标准对象实例

class Foo
  constructor: (@bar) ->
    foo = () =>
      console.log @bar
    foo.baz = ->
      console.log 'baz'
    return foo
f = new Foo 'bar'
f()
f.baz()

这可能只是将
class
用作包装器,就像
do()
一样
f
{[Function]baz:[Function]}
。而且
Foo'bar'
(没有
new
)也会产生同样的效果。

这就是我尝试过的。构造函数返回一个函数,但它不是一个正式的构造函数。返回的函数在类定义中不包含任何方法,而是一个裸函数。我编辑了我的问题并在类中添加了一个方法,请再试一次。链接模式更复杂,这是必要的。您可以很容易地编写一个coffeescript类,它可以用相同的结果执行类似的操作,请参见我的答案。
{ [Function]
  whatstuff: 'really awesome',
  doStuff: [Function] }