Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   ES6: Как сделать фабрику методов для класса? (https://javascript.ru/forum/misc/70000-es6-kak-sdelat-fabriku-metodov-dlya-klassa.html)

Alexandroppolus 04.08.2017 18:40

Цитата:

Сообщение от Shitbox2 (Сообщение 460582)
В TS можно так сделать. Будет работать. Правда, когда применяю к классу декоратор, все такие методы пропадают, но это я как-то декоратор неправильно пишу
function CreateMethod(params) {
  return function() {
     console.log(params)
  }
}

class Dog {
  bulk = CreateMethod({name: 'bulk', volume: 90})
}

если верить плейграунду, то bulk создается в конструкторе.
на каждый экземпляр - новый метод. При том что тут не нужны данные из экземпляра.
если экземпляров много, таки лучше через прототип. Конечно, выглядит совсем не по-хипстерски, зато правильнее :)

Shitbox2 06.08.2017 04:02

Учитывая, что это всё используется в Ангуляре (кто-то использует TS по-другому? ;-), а сервисы там преимущественно синглтоны, то копировать свойства в конструкторе нормально... Не понимаю, зачем ангуляровцы, вообще, ООП используют при таком раскладе

Shitbox2 11.08.2017 15:29

Что происходит, когда мы возвращаем значение из конструктора?
var f : any = function (...args) {
    console.log("New: " + original.name);
    return new original(...args);
}


В документации по ES6/TypeScript таких примеров нет

Alexandroppolus 11.08.2017 15:37

Цитата:

Сообщение от Shitbox2
Что происходит, когда мы возвращаем значение из конструктора?

если это значение - объект, то результатом всего вызова new будет это значение.

Shitbox2 11.08.2017 16:07

А где об этом можно почитать? Это поведение ES6 или TypeScript добавляет?

Alexandroppolus 11.08.2017 16:14

Цитата:

Сообщение от Shitbox2
А где об этом можно почитать?

в самом что ни на есть МДНе
https://developer.mozilla.org/ru/doc.../Operators/new

это стандартное js-ное поведение, существует от сотворения мира.

Shitbox2 11.08.2017 16:26

И как это я упустил этот момент) Спасибо!

Shitbox2 11.08.2017 16:57

Еще вопрос, чтобы новую тему не создавать. Пример из статьи: https://www.sitepen.com/blog/2015/10...pt-decorators/

Реализация декоратора @readonly
function readonly<TFunction extends Function>(Target: TFunction): TFunction {
    let newConstructor = function () {
        Target.apply(this);
        Object.freeze(this);
    };
 
    newConstructor.prototype = Object.create(Target.prototype);
    newConstructor.prototype.constructor = Target;
 
    return <any> newConstructor;
}

Зачем здесь делают Target.apply(this);? По-моему, это просто вызовет конструктор без аргументов. Смысл?

Ну и
newConstructor.prototype = Object.create(Target.prototype);
newConstructor.prototype.constructor = Target;

так ли нужны?

Alexandroppolus 11.08.2017 17:40

Цитата:

Сообщение от Shitbox2
Зачем здесь делают Target.apply(this);? По-моему, это просто вызовет конструктор без аргументов. Смысл?

аргументы незаслуженно забыты.
Target.apply(this, arguments);

По сути, тут создается новый класс, который в точности как Target, только объекты после создания замораживаются. Потому конструктор вызывать надо.

Цитата:

Сообщение от Shitbox2
Ну и
newConstructor.prototype = Object.create(Target.prototype);
newConstructor.prototype.constructor = Target;

так ли нужны?

Возможно (однако нельзя сказать наверняка), стоило обойтись таким кодом:
newConstructor.prototype = Target.prototype;

Shitbox2 11.08.2017 17:52

Цитата:

По сути, тут создается новый класс, который в точности как Target, только объекты после создания замораживаются. Потому конструктор вызывать надо.
Т.е. это эквивалентно super(args)?


Часовой пояс GMT +3, время: 22:19.