私はクラスベースのOOシステムを使用するC#/ Javaのバックグラウンドから来ていますが、まだJavaScript/CoffeeScriptプロトタイプのOOシステムは取得していません。下のCoffeeScriptクラスを書いたので、システム側の好みに応じて連絡先の名前を表示することができます。私はクラスを動作させるには、joinNonEmpty(stringList, joinText)
メソッドをプロトタイプに所属させ、それをJava/C#土地で静的メソッドと呼ぶ方法で呼び出すだけです。私のcoffeescriptメソッドはなぜクラスに属していなければなりませんか?
this.joinNonEmpty(...)
を使用してこのメソッドを呼び出す方法はありますか?- これでコンストラクタ内の
firstLastRender, lastFirstRender and firstOrNickThenLast
メソッドを参照できる理由を説明できますか?joinNonEmpty
ヘルパーに電話するときは、これらの方法では機能しませんか? - これは、私が環境設定マップで適切なメソッドを見つける方法と関係がありますか?答えるために時間を割いて
prefs = displayNameFormat: "FirstOrNickThenLast"
class DisplayNameRenderer
constructor: ->
@prefToRenderMap =
FirstLast: this.firstLastRender
LastFirst: this.lastFirstRender
FirstOrNickThenLast: this.firstOrNickThenLast
# Why does this method have to be static (a class method)?
@joinNonEmpty: (stringList, joinText) ->
nonEmptyStrings = []
for s in stringList
nonEmptyStrings.push(s) if s isnt null and s isnt ""
nonEmptyStrings.join(joinText)
firstLastRender: (contact) ->
# TypeError: Object expected.
joinNonEmpty([contact.firstName, contact.lastName], ' ')
lastFirstRender: (contact) ->
# TypeError: Object doesn't support this method or property
this.joinNonEmpty([contact.lastName, contact.firstName], ', ')
firstOrNickThenLast: (contact) ->
# Works correctly.
DisplayNameRenderer.joinNonEmpty([(if contact.nickname isnt null and contact.nickname isnt "" then contact.nickname else contact.firstName), contact.lastName], ' ')
render: (contact) ->
@prefToRenderMap[prefs.displayNameFormat](contact)
contact = firstName: "Jonathan", nickname: "Jonny", lastName: "Appleseed"
dnr = new DisplayNameRenderer()
# => "Jonny Appleseed"
console.log dnr.render(contact)
感謝。
これはかなり意味があります、ありがとうございます。私はスコープについて何が起こっているのかを理解しています。 –