未定義である理由を理解しようとしています1.9
class CommandParser
obj:
message: null
indicator: 'warning'
stackTrace: null
result: null
isException: false
constructor: (@command, @params, @result) ->
@obj.result = result //@obj is undefined
ですundefined
の場合、result
変数がないため、ReferenceErrorが返されます。
あなたが言うとき:いずれかの方法について
m: (@i) -> ...
を、引数リストの中@i
が自動的にオブジェクト上@i
インスタンス変数にそのパラメータ値を割り当てますが、i
ローカル変数は存在しません。だからあなたのconstructor
:
constructor: (@command, @params, @result) ->
は自動的にあなたがそれを呼び出す@command
、@params
、および@result
インスタンス変数を設定しますが、何のresult
ローカル変数はどこでも目の前ではありません。あなたはresult
値を見てみたいなら、あなたは@result
見たい:
constructor: (@command, @params, @result) ->
@obj.result = @result
# ------------^
か、引数リストの中のオフ@
を残したい:世話を明らかにバグです
constructor: (@command, @params, result) ->
@obj.result = result
をof、隠れたバグが次に来る。
class C
p: { a: 11 }
その後、p
は、それがC
のすべてのインスタンスで共有されるようにC
の試作品の一部です:あなたは、クラスレベルで何かを定義する場合。彼らは両方ともまったく同じ@obj
の参照を使用しているので、
c1 = new CommandParser('c1', 'p1', 'r1')
c2 = new CommandParser('c2', 'p2', 'r2')
両方c1.obj.result
とc2.obj.result
は'r2'
を次のようになります。あなたのケースでは、あなたが言うので、場合CommandParser
のすべてのインスタンスで共有される唯一の@obj
オブジェクトが存在します。
デモ:各インスタンスは、独自のを取得するようにクラスレベルで変更可能な値を定義https://jsfiddle.net/ambiguous/kffswpxm/
はほとんど常に間違いです、あなたのコンストラクタでそれらを定義します。
class CommandParser
constructor: (@command, @params, @result) ->
@obj =
message: null
indicator: 'warning'
stackTrace: null
result: @result
isException: false
デモ:https://jsfiddle.net/ambiguous/k3kmg1cc/
あなたは文書化のためクラスレベルでそれらを定義したい場合、あなたはあなたのコンストラクタで、それのクローンを作成したいと思います:
class CommandParser
obj:
message: null
indicator: 'warning'
stackTrace: null
result: null
isException: false
constructor: (@command, @params, @result) ->
@obj = _(@obj).cloneDeep()
@obj.result = @result
デモ:https://jsfiddle.net/ambiguous/r69vood7/
例があり、cloneDeep
from Lodashを使用していることほぼすべてのユーティリティベルトJavaScriptライブラリに類似のクローンツールです。