javascript - CoffeeScript 类变量可见性

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

最佳答案

看来您在访问属于该类实例的选项时遇到了问题,对吗?

你知道这是因为 jQuery.eachthis 设置为 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/

相关文章:

javascript - jqGrid TreeGrid问题

c++ - C4018 : Signed, 类内无符号不匹配

javascript - 在异步函数中设置和访问全局对象

javascript - 如何让我的类装饰器只在继承链中最外层的类上运行?

javascript - MarkLogic 8 - 将大型结果集流式传输到文件 - JavaScript - Node.js 客户端 API

c++ - 当函数是指向类函数的指针但在该类之外时如何正确调用函数

javascript - Kotlin 编译器到 JavaScript 中的 JavaScript?

javascript - 为什么 CoffeeScript 默认打印到控制台,以及如何禁用它?

javascript - html页面上动态填充的选择菜单将在不使用jquery mobile的情况下显示在android webview上

c++ - C++类方法定义语法