2016-11-17 9 views
0

私はCoffeeScriptコードを見ていますが、私はクラス変数が定義されていない理由を理解しようとしています。その後、あなたは@objのためにはTypeErrorを取得していないCoffeeScriptクラス変数undefined 1.9

class CommandParser 
    obj: 
    message: null 
    indicator: 'warning' 
    stackTrace: null 
    result: null 
    isException: false 
    constructor: (@command, @params, @result) -> 
    @obj.result = result 

:CoffeeScriptの実行時には、私は@objはあなたのインデントが実際のように見えると仮定すると、

答えて

0

未定義である理由を理解しようとしています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.resultc2.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ライブラリに類似のクローンツールです。

関連する問題