Показать сообщение отдельно
  #1506 (permalink)  
Старый 27.10.2015, 01:49
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

/**
 * @interface
 */
class Base {
  constructor() {
    Object.assign(this, this.constructor.castConstructorData(...arguments));
  }

  clone() {
    return new this.constructor(this);
  }

  static castConstructorData() {};
}

class Point extends Base {
  /**
   *
   * @param {(number|Point|{x: number, y: number})} pointOrX
   * @param {number} [y]
   */
  constructor(pointOrX, y) {
    super(...arguments);
  }

  /**
   * @see Point
   */
  static castConstructorData(pointOrX, y) {
    if (typeof pointOrX === 'number') {
      return {x: pointOrX, y};
    }

    if (typeof pointOrX === 'object') {
      return {x: pointOrX.x, y: pointOrX.y};
    }

    throw new TypeError(`Invalid arguments for Point`);
  }
}


console.log(new Point(1, 2));
console.log(new Point({x: 1, y: 2}));
console.log(new Point(new Point(1, 2)));
console.log(new Point(1, 2).clone());
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием