Javascript 定义一个在CoffeeScript中创建新函数的类
我想使用“class”语法创建一个类,当它通知一个实例时,该实例可以直接用作函数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 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] }