我想使用'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中重现它。
答案 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.prototype
(which is impossible)的可调用对象,但它会返回一个混合了某些属性的Function
对象。< / p>
更好的模式不是返回可调用的函数对象,而是返回具有call
或execute
方法的标准对象实例。
答案 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
)会产生相同的结果。