サブクラスによってオーバーライドできるが、コールバックとしても使用できるメソッドを持つクラスを作成したいと考えています。いずれかの状況でのみ、目的の動作を取得できるようです。次に例を示します。
class Parent
constructor: () ->
@foo = "foo"
fooNotAlwaysDefined: () ->
console.log("In parent.fooNotAlwaysDefined, @foo:#{@foo}")
childNotCalled: () =>
console.log("In parent.childNotCalled, @foo:#{@foo}")
class Child extends Parent
fooNotAlwaysDefined: () ->
console.log("In child.fooNotAlwaysDefined, @foo:#{@foo}")
childNotCalled: () ->
console.log("In child.childNotCalled, @foo:#{@foo}")
c = new Child()
c.fooNotAlwaysDefined()
c.childNotCalled()
process.nextTick(c.fooNotAlwaysDefined)
process.nextTick(c.childNotCalled)
私が望むのは、子関数が呼び出され、@foo が両方の使用 (c. およびコールバックとして) のスコープ内にあることです。これが私が得る出力です:
child.fooNotAlwaysDefined では、@foo:foo
parent.childNotCalled では、@foo:foo
child.fooNotAlwaysDefined では、@foo:undefined
parent.childNotCalled では、@foo:foo
私が見つけた最善の回避策は、process.nextTick に与えられた匿名関数内に fooNotAlwaysDefined をラップできることですが、それは理想的とは言えません。
process.nextTick(() -> c.fooNotAlwaysDefined())
child.fooNotAlwaysDefined では、@foo:foo
私が望む動作を得るためにクラスを構造化する方法はありますか?
編集: 回答: 以下の非常に役立つコメントの要約は、childNotCalled で見られる動作がバグであるということです。この動作は 1.6.1 で発生しているため、改善されている可能性がありますが、この問題は解決されていません。
2 番目の編集: この問題は 1.6.2 で完全に解決されたようです。