我有这样的东西:
class @Cat
defaults:
name: ''
weight: 0
constructor: ( @options ) ->
$.each @.defaults, (key, val) =>
@options[key] = val unless @options.hasOwnProperty(key)
我想用
$.each (array, callback), (index, value) ->
而不是
$.each (array, callback), (index, value) =>
并使用类变量@options
,但显然@
指的是数组。
解决方案?
最佳答案
看来您在访问属于该类实例的选项
时遇到了问题,对吗?
你知道这是因为 jQuery.each将 this
设置为 val 变量的对象包装版本,因此 @options
在该回调中不起作用。
在下面的示例中,细微的变化是我关闭了变量 opts
上的 each
回调,这将允许您的循环引用@options
即使this
已更改。
class Cat
defaults:
name: 'tabby'
weight: 5
constructor: (@options) ->
opts = @options
$.each @defaults, (key, val) ->
opts[key] = val unless opts.hasOwnProperty(key)
c = new Cat(name: 'fluffy')
console.log c.options
注意,不需要双箭头:)在您的情况下,双箭头不会有什么坏处,因为您访问的是变量 val
而不是使用 @
来访问引用当前迭代的值,但在不是绝对必要时尝试摆脱 =>
是正确的。
尝试一下这个 fiddle :http://jsfiddle.net/chicagogrooves/72fa3/
也就是说,我想提一下,对于覆盖默认值的情况,您可以使用 jquery.extend而不是手动编写循环。这是很常见的事情,它是许多库的一部分,而不是您通常需要手动编写的东西。但我想更彻底地解释,因为双箭头和 this
是需要了解的好概念。
关于javascript - CoffeeScript 类变量可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25013334/