Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1501 (permalink)  
Старый 20.10.2015, 09:30
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

l-liava-l,
сенк попробую
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
Ответить с цитированием
  #1502 (permalink)  
Старый 26.10.2015, 09:34
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Как описать в jsdoc параметрический полиморфизм конструктора? А именно, то что он может вызываться следующим образом:
new Point( {x: {Number}, y: {Number}}.<Point> ); // передается другой экземпляр {Point}
new Point( [x {Number}, y {Number}].<Array> ); // массив с координатами
new Point( x {Number}, y {Number} ); // координаты

?
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #1503 (permalink)  
Старый 26.10.2015, 20:23
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

nerv_,
/**
 *
 * @param {(number|Point|number[])} paramOrX
 * @param {number} [y]
 * @constructor
 */
function Point(paramOrX, y) {

}


Хотя, как по мне, правильнее будет выбрать что-то одно -- я бы предпочел два параметра, x и y, тогда проблему с массивами решаем через new Point(...[x, y]), а для других Point'ов заведи статик метод типа Point.fromPoint(point) или метод clone в прототипе.
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)

Последний раз редактировалось trikadin, 26.10.2015 в 20:28.
Ответить с цитированием
  #1504 (permalink)  
Старый 26.10.2015, 21:25
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

nerv_, @variation
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #1505 (permalink)  
Старый 27.10.2015, 01:07
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от trikadin
Хотя, как по мне, правильнее будет выбрать что-то одно -- я бы предпочел два параметра, x и y, тогда проблему с массивами решаем через new Point(...[x, y]), а для других Point'ов заведи статик метод типа Point.fromPoint(point) или метод clone в прототипе.
мой код сейчас выглядит так:
'use strict';


export default class Point {
    /**
     * @param {Point|Array<Number>} some
     */
    constructor(...some) {
        let [x, y] = Point.factory(some);
        this.x = x;
        this.y = y;
    }
    /**
     * @returns {Point}
     */
    clone() {
        return new Point(this);
    }
    /**
     * @param {Array} some
     * @returns {Object}
     */
    static factory(some) {
        if (some instanceof Array) {
            switch (some.length) {
                case 2:
                    return some;
                case 0:
                    return [0, 0];
                default:
                    break;
            }
        }
        if (some instanceof Point) {
            return [some.x, some.y];
        }
        if (some instanceof Object) {
            if ('x' in some && 'y' in some) {
                return [some.x, some.y];
            }
        }
        throw new TypeError(`This type not supported.`);
    }
}


---

FINoM, пример? Шторм вроде как не подхватывает...
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук

Последний раз редактировалось nerv_, 27.10.2015 в 01:17.
Ответить с цитированием
  #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)
Ответить с цитированием
  #1507 (permalink)  
Старый 27.10.2015, 04:52
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

Сообщение от FINoM
nerv_, @variation
Это же вообще о другом О_о
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #1508 (permalink)  
Старый 27.10.2015, 10:50
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

nerv_, с @variation нужно несколько раз объявить метод или класс:
/**
* method x
* variation 1
* ...
*/

/**
* method x
* variation 2
* ...
*/
Сообщение от trikadin
Это же вообще о другом
Тогда я не понял задачи. Вроде надо было объявить несколько вариантов использования одного метода, не?
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #1509 (permalink)  
Старый 27.10.2015, 11:30
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

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)));
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук

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

nerv_, ты сравнил интерфейс и имплементацию О_о

Используй class properties из es7, и будет сразу отлично видно, какие свойства у класса есть. Советую в связке с flow -- webstorm его хорошо держит, это удобнее, чем jsdoc.
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Смишных картинок тред megaupload Оффтопик 3447 03.07.2023 09:47
React'а тред melky Оффтопик 246 13.11.2016 08:07
Webpack'а тред nerv_ Сборка проекта, утилиты 58 07.05.2016 13:46
Смешных историй тред monolithed Оффтопик 11 04.03.2015 04:20
Смишных видео с намеком тред godofjavascript Оффтопик 4 30.12.2012 23:50