如何使方法私有并在Coffeescript中继承它?

Jon*_*nas 2 javascript private-members coffeescript

如何使方法"btnClick"私有?

class FirstClass
  constructor: ->
    $('.btn').click @btnClick

  btnClick: =>
    alert('Hi from the first class!')

class SecondClass extends FirstClass
  btnClick: =>
    super()
    alert('Hi from the second class!')

@obj = new SecondClass
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/R646x/17/

mu *_*ort 15

在JavaScript中没有私有,所以在CoffeeScript中没有私有,有点像.您可以在类级别将事物设为私有,如下所示:

class C
    private_function = -> console.log('pancakes')
Run Code Online (Sandbox Code Playgroud)

private_function将只在内部可见C.问题是,这private_function只是一个函数,它不是实例的方法C.您可以使用Function.apply或解决此问题Function.call:

class C
    private_function = -> console.log('pancakes')
    m: ->
        private_function.call(@)
Run Code Online (Sandbox Code Playgroud)

所以在你的情况下,你可以做这样的事情:

class FirstClass
    btnClick = -> console.log('FirstClass: ', @)
    constructor: ->
        $('.btn').click => btnClick.call(@)

class SecondClass extends FirstClass
    btnClick = -> console.log('SecondClass: ', @)
Run Code Online (Sandbox Code Playgroud)

演示:http://jsfiddle.net/ambiguous/5v3sH/

或者,如果你不需要@btnClick是什么特别,你可以使用的功能,就是:

class FirstClass
    btnClick = -> console.log('FirstClass')
    constructor: ->
        $('.btn').click btnClick
Run Code Online (Sandbox Code Playgroud)

演示:http://jsfiddle.net/ambiguous/zGU7H/

  • 我不太关心(咖啡| Java)脚本中的可见性,语言不支持它,因此任何控制可见性的尝试都充其量只是一个障碍.与我见过的惯例最接近的是一个前导下划线(`_some_private_method: - > ...`),但你仍然必须完全了解所有祖先类的结构. (3认同)
  • 我认为使用前导下划线的最佳理由是,作者记得,当她在2个月后回来加强代码时,该方法并不打算在课外使用.它简短,普遍接受,易于记住其目的. (2认同)