簡體   English   中英

定義在CoffeeScript中新增功能的類

[英]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對象。

更好的模式不是返回可調用的函數對象,而是返回具有callexecute方法的標准對象實例。

這是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM