【问题标题】:How to make method private and inherit it in Coffeescript?如何将方法设为私有并在 Coffeescript 中继承?
【发布时间】:2012-05-16 05:02:42
【问题描述】:

如何将“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

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

【问题讨论】:

    标签: javascript coffeescript private-members


    【解决方案1】:

    JavaScript 中没有私有,所以 CoffeeScript 中也没有私有。您可以像这样在班级级别将内容设为私有:

    class C
        private_function = -> console.log('pancakes')
    

    private_function 将仅在 C 中可见。问题是private_function 只是一个函数,它不是C 实例的方法。您可以使用Function.applyFunction.call 来解决这个问题:

    class C
        private_function = -> console.log('pancakes')
        m: ->
            private_function.call(@)
    

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

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

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

    或者,如果您不需要 btnClick 中的 @ 是任何特别的东西,您可以按原样使用该函数:

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

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

    【讨论】:

    • btnClick = -> console.log('SecondClass: ', @) 永远不会执行
    • @Jonas:不,它没有,你说你想要一些“私人”的东西,对我来说这意味着“只在 FirstClass 中可见”。 JavaScript 中没有 public/private/protected 所以它也不在 CoffeeScript 中,在某些情况下你充其量可以模拟它。
    • 我应该费心隐藏方法吗?什么是一般做法?也许“私有”方法有 js 命名约定?
    • 我不太关心 (Coffee|Java)Script 中的可见性,这些语言不支持它,所以任何控制可见性的尝试充其量只是一个杂项。我见过的最接近约定的是前导下划线 (_some_private_method: -> ...),但您仍然必须充分了解所有祖先类的结构。
    • 我认为使用前导下划线的最佳理由是为了让作者记住,当她 2 个月后回来增强代码时,该方法不打算在课堂外使用。它很短,被普遍接受,并且很容易记住它的目的。
    猜你喜欢
    • 2013-01-01
    • 2014-11-24
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    • 2015-05-16
    • 2012-02-28
    相关资源
    最近更新 更多