Несколько Конструкторов в coffeescript - PullRequest
2 голосов
/ 27 января 2012

Когда я пытаюсь написать несколько конструкторов в сценарии кофе, я получаю эту ошибку: 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

Я хочу иметь пустуюконструктор и 2 других конструктора.Это возможно?

Ответы [ 4 ]

11 голосов
/ 27 января 2012

просто сделайте это следующим образом:

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
###
3 голосов
/ 27 января 2012

Нет, это невозможно. Вы можете использовать объект аргументов, хотя. Просто пример, это может быть лучше:

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

Вот тикет с запросом на перегрузку, патч не был отправлен, и Ашкен закрыл его: https://github.com/jashkenas/coffee-script/issues/531

1 голос
/ 24 ноября 2012

Более конкретно, почему это невозможно в JavaScript, а также в CoffeeScript: JavaScript не допускает перегрузки методов, поскольку методы являются просто хеш-ключами объекта (будь то this, прототип из this - или контекст stack object, если вы используете выражение функции). Поэтому методы могут быть идентифицированы только по имени, а не по всей подписи (переданные параметры или возвращаемое значение). Из-за этого та же функция позволяет динамически читать фактические переданные параметры, используя псевдомассив arguments.

0 голосов
/ 15 октября 2017

Как заявил JaredMcAteer, несколько конструкторов технически невозможны, но предложение 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 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...