coffeescript中的多个构造函数

coffeescript中的多个构造函数,coffeescript,Coffeescript,当我尝试在coffee脚本中编写多个构造函数时,我会遇到以下错误:不能在一个类中定义多个构造函数 我如何做到这一点: class Vector2 x: 0 y: 0 constructor:() -> constructor:(@x, @y) -> constructor:(vector) -> x = vector.x y = vector.y 我想要一个空构造函数和另外两个构造函数。这可能吗?不可能。不过,您可以使用argum

当我尝试在coffee脚本中编写多个构造函数时,我会遇到以下错误:
不能在一个类中定义多个构造函数

我如何做到这一点:

class Vector2
  x: 0
  y: 0

  constructor:() ->

  constructor:(@x, @y) ->

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

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

不可能。不过,您可以使用arguments对象。举个例子,这可能更好:

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

这是一张要求过载功能的罚单,没有提交修补程序,Ashkenas关闭了它:

简单,用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
###

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

正如JaredCater所述,从技术上讲,多个构造函数是不可能的,但island205的建议达到了相同的效果

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

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 }

arguments
应该是一个参数,还是就在那里?
arguments
是一个神奇的对象,一个伪数组,在JavaScript中,在函数中可用。对于CoffeeScription:)可以使用
构造函数:(args…->switch args.length…
如果在splat之前定义一些命名变量,我可以看出这一点的有用性,但在这种情况下它会提供什么好处?在关闭票据时,Ashkenas提到,如果提供了补丁,他将重新打开票据。因此,如果您有雄心壮志,可以添加该功能。票据中提出的一些解决方案非常简单。