访问CoffeeScript类中的变量

时间:2012-01-03 15:09:58

标签: coffeescript

在下面的代码中,我的印象是使用'胖箭'可以让我访问类变量。相反,无论胖或瘦箭头,我都无法访问'@accounts'变量。

有什么建议吗?

class MyClass
  accounts:[]
  constructor: (@accounts) -> 
    ($ '.the_buttons').live 'click', bind_clicks

  bind_clicks = (event) -> 
    console.log @accounts

jQuery -> 
  m = new MyClass([1, 2, 3])

感谢。

更新

看起来我以前输入错误导致了一些问题。

以下是排序的代码

class MyClass
  accounts:[]
  constructor: (@accounts) -> 
    ($ '.the_buttons').live 'click', (event) => bind_clicks(event)

  bind_clicks: (event) => 
    console.log @accounts

jQuery -> 
  m = new MyClass([1, 2, 3])

然而,使用bind_clicks成为公共方法感觉很奇怪。

4 个答案:

答案 0 :(得分:1)

你可以这样做

class MyClass
  bind_clicks = (event) -> 
    console.log @accounts

  accounts:null
  constructor: (@accounts) -> 
    ($ '.the_buttons').live 'click', bind_clicks


jQuery -> 
  m = new MyClass([1, 2, 3])

bind_clicks是在实例方法之前声明的。这是私人的。但是,它是一种私有的方法。它会产生一个闭包,这就是原因。我建议使用_bind_clicks,下划线前缀是定义私有方法的常用约定。因为这在javascript中并不存在。

当您申报帐户时也要小心:[],我建议帐号:null,更多内容:http://html5stars.com/?p=148

答案 1 :(得分:0)

另一种可能的方法。它与你的非常相似。

class MyClass
  constructor: (@accounts) -> 
    $('body').live 'click', @bind_clicks

  bind_clicks: (event) => 
    console.log @accounts

$ ->
  m = new MyClass([1, 2, 3])

不要引用我这个,但我不认为JS有任何公共/私人方法的概念。我想如果你不想公开你可以做的这个方法。但是,如果您多次使用此方法,您可能会冒险或重复自己。

class MyClass
  constructor: (@accounts) -> 
    $('body').live 'click', (event) => 
      console.log @accounts

$ ->
  m = new MyClass([1, 2, 3])
祝你好运! 桑德罗

注意:我限制了身体的事件,所以我可以测试代码。

答案 2 :(得分:0)

您可以将bind_clicks设为私有,如下所示:

class MyClass
  accounts:[]
  constructor: (@accounts, @button) ->
    bind_clicks = (event) =>
      console.log @accounts 
    @button.click bind_clicks

class Button
  click: (@f) ->
  do_click: -> @f('event') 

button = new Button()
m = new MyClass([1, 2, 3], button)
console.log m.bind_clicks # undefined (private)
button.do_click() # [1, 2, 3]

答案 3 :(得分:0)

您可以尝试一下:http://jsfiddle.net/zp6LJ/1/

私有方法必须在构造函数中定义,以实现您正在寻找的东西。

class MyClass
  accounts:[]
  constructor: (@accounts) -> 
    bind_clicks = (event) =>
      console.log @accounts

    $('.the_buttons').click bind_clicks

jQuery -> 
  m = new MyClass([1, 2, 3])