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

Сообщение от nerv_
1. когда в js появятся интерфейсы, тогда и поговорим Сейчас их нет)
2. кроме того интерфейс - это описатель (насколько я понимаю), а у тебя уже реализация в твоем "интерфейсе" подмешена. Т.е. это не интерфейс, а базовый класс.
Ну да, ты прав. Но в любом случае, это класс, не предназначенный для инстанциации, только для наследования. Какие плюсы вижу я: я использую this.constructor, а не Point (т. е. при наследовании всё будет правильно), можно создать много потомков Base, у которых будет единая логика, поведение легко перегружается и расширяется.

Сообщение от nerv_
я всерьез подумываю о том, чтобы перейти на typescript
Он крутой, но стоит подождать 2.0, к сожалению. А пока можно юзать Flow для базовой аннотации:

class Base {
  constructor() {
    Object.assign(this, this.constructor.castConstructorData(...arguments));
  }

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

  static castConstructorData() {};
}

class Point extends Base {
  x: number;
  y: number;

  constructor(
    pointOrX: ?(number | {x: number, y: number} | Point) = 0,
    y: ?number = 0
  ) {
    super(...arguments);
  }

  static castConstructorData(
    pointOrX: ?(number | {x: number, y: number} | Point) = 0,
    y: ?number = 0
  ) : {x: number, y: number} {
    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());
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)
Ответить с цитированием