coffeescript类变量可见性

时间:2014-07-29 10:38:14

标签: javascript class coffeescript visibility

我有这样的事情:

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,但显然@指的是数组。 溶液

1 个答案:

答案 0 :(得分:2)

您似乎无法访问属于该类实例的options,对吗?

你知道这是因为jQuery.eachthis设置为val变量的对象包装版本,因此@options在该回调中不起作用。

在下面的示例中,稍有变化是我已关闭变量each上的opts回调,这将允许您的循环引用@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而不是使用@来引用变量值{当前的迭代,但是当你不是绝对必要时,你试图摆脱=>是正确的。

在这个小提琴上试试:http://jsfiddle.net/chicagogrooves/72fa3/

那就是说,我想提一下,对于覆盖默认值的情况,您可以使用jquery.extend而不是手动编写循环。这是一个很常见的事情,它是许多库的一部分,而不是你需要手工编写的东西。但我想更彻底地解释,因为双箭头和this是很好的概念。