trikadin, сравни это
class Point {
/**
* @param {Point|Array<Number>} some
*/
constructor(...any) {
let [x, y] = Point.factory(any);
this.x = x;
this.y = y;
}
}
и это
/**
* @interface
*/
class Base {
constructor() {
Object.assign(this, this.constructor.castConstructorData(...arguments));
}
}
в первом случае я сразу вижу свойства объекта, во втором - кто его знает что там
FINoM, можно больше кода? Напиши для функции foo() пример.
---
забыл, что можно запускать уже подобный код в браузере
'use strict';
class Point {
/**
* Examples:
* new Point()
* new Point(1, 2)
* new Point([3, 4])
* new Point({x: 5, y: 6})
* new Point(new Point(7, 8))
*
* @param {Point|Array<Number>} some
*/
constructor(some) {
let xy = Point.factory(Array.from(arguments)); // все-таки нельзя пока без доводки руками =(
this.x = xy[0];
this.y = xy[1];
}
/**
* @returns {Point}
*/
clone() {
return new Point(this);
}
/**
* @param {Point|Array<Number>} some
* @returns {Object}
*/
static factory(some) {
if (!some.length) {
return [0, 0];
}
if (some.length === 2) {
return some;
}
let first = some[0]; // some.length === 1
if (first instanceof Array) {
return first;
}
if (first instanceof Point) {
return [first.x, first.y];
}
if (first instanceof Object) {
if ('x' in first && 'y' in first) {
return [first.x, first.y];
}
}
throw new TypeError(`This type not supported.`);
}
}
console.log(new Point());
console.log(new Point(1, 2));
console.log(new Point([3, 4]));
console.log(new Point({x: 5, y: 6}));
console.log(new Point(new Point(7, 8)));