![](/img/trans.png)
[英]Define class in coffeescript, 'Cannot read property 'apply' of undefined'
[英]Define a class that new a function in CoffeeScript
我想使用“類”語法創建一個類,當它通知實例時,該實例可以直接用作函數。
class Foo
constructor: (@bar) ->
baz: ->
console.log 'baz'
...
f = new Foo 'bar'
f() # runs () -> console.log @bar
f.baz() # 'baz'
這是一個JavaScript解決方案,但我無法使用類語法在CoffeeScript中重現它。
我認為您無法編寫一個可以編譯為Javascript(或類似語言)的Coffeescript類。 Coffeescript class
堅持兩點:
它以return AwesomeObject;
結束類主體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;
})();
PS https://github.com/jashkenas/coffee-script/issues/861關於new Foo()
和Foo()
語法的Coffeescript問題討論。 共識似乎是,雖然在Javascript中允許對諸如Date
之類的對象進行new-less
調用,但對於用戶定義的類卻不鼓勵這樣做。 這很有趣,盡管與這里的問題並不真正相關。
這樣的事情怎么樣:
class Foo
constructor: (@bar) ->
return => console.log @bar
f = new Foo 'bar'
f()
這是您要尋找的:
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
的可調用對象( 這是不可能的 ),但是會返回混合了某些屬性的Function
對象。
更好的模式不是返回可調用的函數對象,而是返回具有call
或execute
方法的標准對象實例。
這是Bergi's
答案的一種變化:
class Foo
constructor: (@bar) ->
foo = () =>
console.log @bar
foo.baz = ->
console.log 'baz'
return foo
f = new Foo 'bar'
f()
f.baz()
就像do()
一樣,這可能只是使用class
作為包裝器。 f
是{ [Function] baz: [Function] }
。 Foo 'bar'
(沒有new
)也產生相同的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.