【问题标题】:Is it possible to have a static function and member function of the same name in a coffeescript class?咖啡脚本类中是否可以有同名的静态函数和成员函数?
【发布时间】:2015-12-03 05:40:00
【问题描述】:

如果我的问题措辞不正确或难以理解我在问什么,这里有一个简化的示例来说明我正在尝试做的事情。

class Number
  constructor: (@num) ->

  @add: (operand1, operand2) ->
    return operand1 + operand2

  add: (operand) =>
    @num = @add(@num, operand)

Number num1
Number num2
Number.add(num1, num2)
num1.add(num2)

这样做的目的是,Number.add(num1, num2) 可以用于静态返回 Number 类的两个对象的总和,并且 Number 类的对象可以使用 num1.add(num2) 向其添加另一个数字对象静态函数的代码。当我试图在我的项目中实现类似的代码时,结果是递归的混乱。我意识到在 add 函数中调用 @add 是在调用自身,这不是这里想要的。我正在尝试做的事情是可能的,还是我在这里尝试一些愚蠢的事情?

【问题讨论】:

    标签: javascript class static coffeescript


    【解决方案1】:

    num1num2 是对象,您必须处理它们的 num 属性:

    class Number
      constructor: (@num) ->
    
      @add: (operand1, operand2) ->
        # the addition must be done on num property
        operand1.num + operand2.num
    
      add: (operand) ->
        # here, you must call Number.add
        Number.add(@, operand)
    
    # to create Number, use new Number
    num1 = new Number 10
    num2 = new Number 5
    console.log Number.add(num1, num2)
    console.log num1.add(num2)
    

    在两个 add() 函数中,您应该检查操作数是否为 Numbers 以避免任何错误。

    【讨论】:

    • 太棒了,谢谢!您知道为什么在静态 add 函数上调用 apply() 会说“无法读取未定义的属性 'apply'”。我这样称呼它:Number.add.apply(this, args)。以我以前的方式进行操作时遇到了递归问题,但我能够调用 apply()。
    • 我可以在add(operand) 函数中使用apply(),像这样Number.add.apply(null, [@, operand])
    • 很奇怪。这对我也不起作用。如果只调用了 Number.add() 但在其上使用 apply() 抱怨它不是,则该函数被定义。
    • 奇怪,你用的是什么环境?我试过coffeescript.org 和我的本地nodejs 5.1.0,它适用于两者。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多