当我尝试在咖啡脚本中编写多个构造函数时,我收到此错误: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
我想要一个空构造函数和另外两个构造函数。这可能吗?
答案 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不允许重载方法,因为的方法只是对象的哈希键(this
,this
的原型 - 或者如果使用函数表达式,则使用上下文堆栈对象。因此,方法只能通过其名称来识别,而不能通过其整个签名(参数传递或返回值)来识别。因此,相同的函数允许您使用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 }