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

时间:2014-01-08 07:03:06

标签: javascript class coffeescript

我想使用'class'语法来创建一个类,当它新闻一个实例时,该实例可以直接用作一个Function。

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

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

这是一个JavaScript solution但我无法使用类语法在CoffeeScript中重现它。

4 个答案:

答案 0 :(得分:3)

我认为你不能编写一个Coffeescript类来编译那个Javascript(或接近的东西)。 Coffeescript class坚持两件事:

它以return AwesomeObject;

结束了班级主体

如果我在课程正文中添加return bar,则会error: Class bodies cannot contain pure statements对象。

链接的Javascript模型是:

var AwesomeObject = (function() {
    var AwesomeObject = function() {...};
    ...
    return function() {
      var o = new AwesomeObject();
      ...};
})();

它在内部定义了一个AwesomeObject构造函数,但返回了一个不同的函数。如果内部名称更改为AwesomeObject1,则更清楚。它的功能相同,但无法直接访问AwesomeObject1

此外AwesomeObject()new AwesomeObject()也会返回同样的内容。

{ [Function]
  whatstuff: 'really awesome',
  doStuff: [Function] }

编译后的Coffeescript(class AwesomeObject...)代替:

AwesomeObject = (function() {
  function AwesomeObject() {...}
  ...
  return AwesomeObject;
})();

P.S。 https://github.com/jashkenas/coffee-script/issues/861 Coffeescript就new Foo()Foo()语法进行讨论。共识似乎是,虽然Javascript允许new-less调用Date之类的对象,但不鼓励用户定义的类。这很有趣,虽然与这里的问题不太相关。

答案 1 :(得分:0)

这样的事情怎么样:

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

f = new Foo 'bar'
f()

答案 2 :(得分:0)

这就是你要找的东西:

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.prototypewhich is impossible)的可调用对象,但它会返回一个混合了某些属性的Function对象。< / p>

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

答案 3 :(得分:0)

以下是Bergi's答案的变体:

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)会产生相同的结果。