【问题标题】:coffeescript class variable visibilitycoffeescript 类变量可见性
【发布时间】:2014-09-20 17:00:11
【问题描述】:

我有这样的东西:

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,但显然@指的是数组。 解决方案?

【问题讨论】:

  • 解决方案是不使用-> 而不是=>?你为什么不想要胖箭头?

标签: javascript class coffeescript visibility


【解决方案1】:

您似乎无法访问属于该类实例的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 而不是使用 @ 来引用当前迭代的值,但是在非绝对必要时尝试摆脱 => 是对的。

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

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

【讨论】:

  • 这是我所做的,但我想另一种解决方案。无论如何我坚持下去,因为可能是唯一的解决方案
猜你喜欢
  • 2015-10-20
  • 2016-03-31
  • 2014-04-05
  • 2015-11-24
  • 2011-07-30
  • 2015-07-06
  • 1970-01-01
  • 2013-08-11
  • 1970-01-01
相关资源
最近更新 更多