coffeescript中的多个构造函数

时间:2012-01-27 01:28:31

标签: coffeescript

当我尝试在咖啡脚本中编写多个构造函数时,我收到此错误:cannot define more than one constructor in a class

我该怎么做:

class Vector2
  x: 0
  y: 0

  constructor:() ->

  constructor:(@x, @y) ->

  constructor:(vector) ->
     x = vector.x
     y = vector.y

我想要一个空构造函数和另外两个构造函数。这可能吗?

4 个答案:

答案 0 :(得分:11)

以coffeescript方式做到这一点很简单:

class Vector
  constructor:(@x=0,@y=0) ->
      if typeof @x is "object"
        vector=@x
        @x=vector.x
        @y=vector.y

###
test start
###
v=new Vector()
console.log v.x,v.y
v=new Vector(1,1)
console.log v.x,v.y
v=new Vector {x:1,y:1}
console.log v.x,v.y
###
test end
###

答案 1 :(得分:3)

不,这是不可能的。您可以使用arguments对象。只是一个例子,这可能会更好:

constructor:() ->
    switch arguments.length
        when 0 
            //no args
        when 1
            // vector
        when 2
            // coords

这是要求重载功能的票证,没有提交补丁,Ashkenas关闭了它:https://github.com/jashkenas/coffee-script/issues/531

答案 2 :(得分:1)

更具体地说明为什么在JavaScript中无法实现这一点,以及在CoffeeScript中也是如此: JavaScript不允许重载方法,因为的方法只是对象的哈希键thisthis原型 - 或者如果使用函数表达式,则使用上下文堆栈对象。因此,方法只能通过其名称来识别,而不能通过其整个签名(参数传递或返回值)来识别。因此,相同的函数允许您使用arguments伪数组动态读取实际传递的参数。

答案 3 :(得分:0)

正如JaredMcAteer所说,多个构造函数在技术上是不可能的,但是岛屿205的建议也达到了同样的效果。

作为另一种选择,如何在多个构造函数中使用具有有意义名称的类方法或普通函数?用你的例子,这个怎么样?

class Vector2
  constructor:(@x, @y) ->

  @copy:(vector2) -> new Vector2(vector2.x, vector2.y)

  @zero:() -> new Vector2(0, 0)

然后你可以像这样使用它:

   a = new Vector2(1, 2)
=> Vector2 { x: 1, y: 2 }
   b = Vector2.zero()
=> Vector2 { x: 0, y: 0 }
   c = Vector2.copy(a)
=> Vector2 { x: 1, y: 2 }