constructor - CoffeeScript Class Variable undefined 1.9 -


so looking @ coffeescript code not mine, trying understand why class variable undefined. coffeescript runtime 1.9

class commandparser  obj:    message: null   indicator: 'warning'   stacktrace: null   result: null   isexception: false  constructor: (@command, @params, @result) -> @obj.result = result //@obj undefined 

i trying understand why @obj undefined

assuming indentation looks like:

class commandparser   obj:     message: null     indicator: 'warning'     stacktrace: null     result: null     isexception: false   constructor: (@command, @params, @result) ->     @obj.result = result 

then you're not getting typeerror @obj being undefined, you're getting referenceerror because there no result variable.

when say:

m: (@i) -> ... 

for method @i in argument list automatically assigns parameter value @i instance variable on object there won't i local variable. constructor:

constructor: (@command, @params, @result) -> 

automatically sets @command, @params, , @result instance variables when call there no result local variable anywhere in sight. if want @ result value you'd @ @result:

constructor: (@command, @params, @result) ->   @obj.result = @result   # ------------^ 

or you'd leave @ off in argument list:

constructor: (@command, @params, result) ->   @obj.result = result 

that's obvious bug taken care of, hidden bug comes next. when define @ class level:

class c   p: { a: 11 } 

then p part of c's prototype shared instances of c. in case, there 1 @obj object shared instances of commandparser if say:

c1 = new commandparser('c1', 'p1', 'r1') c2 = new commandparser('c2', 'p2', 'r2') 

then both c1.obj.result , c2.obj.result 'r2' because they're both using same @obj reference.

demo: https://jsfiddle.net/ambiguous/kffswpxm/

defining mutable values @ class level mistake, define them in constructor each instance gets own:

class commandparser   constructor: (@command, @params, @result) ->     @obj =       message: null       indicator: 'warning'       stacktrace: null       result: @result       isexception: false 

demo: https://jsfiddle.net/ambiguous/k3kmg1cc/

if want define them @ class level documentation purposes you'd want clone in constructor:

class commandparser   obj:     message: null     indicator: 'warning'     stacktrace: null     result: null     isexception: false   constructor: (@command, @params, @result) ->     @obj = _(@obj).clonedeep()     @obj.result = @result 

demo: https://jsfiddle.net/ambiguous/r69vood7/

that example uses clonedeep lodash, there similar cloning tools in every utility belt javascript library.


Comments

Popular posts from this blog

account - Script error login visual studio DefaultLogin_PCore.js -

xcode - CocoaPod Storyboard error: -