Сообщение от 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());