Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 04.08.2017, 18:40
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

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

class Dog {
  bulk = CreateMethod({name: 'bulk', volume: 90})
}
если верить плейграунду, то bulk создается в конструкторе.
на каждый экземпляр - новый метод. При том что тут не нужны данные из экземпляра.
если экземпляров много, таки лучше через прототип. Конечно, выглядит совсем не по-хипстерски, зато правильнее
Ответить с цитированием
  #12 (permalink)  
Старый 06.08.2017, 04:02
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

Учитывая, что это всё используется в Ангуляре (кто-то использует TS по-другому? ;-), а сервисы там преимущественно синглтоны, то копировать свойства в конструкторе нормально... Не понимаю, зачем ангуляровцы, вообще, ООП используют при таком раскладе
Ответить с цитированием
  #13 (permalink)  
Старый 11.08.2017, 15:29
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

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


В документации по ES6/TypeScript таких примеров нет
Ответить с цитированием
  #14 (permalink)  
Старый 11.08.2017, 15:37
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Сообщение от Shitbox2
Что происходит, когда мы возвращаем значение из конструктора?
если это значение - объект, то результатом всего вызова new будет это значение.
Ответить с цитированием
  #15 (permalink)  
Старый 11.08.2017, 16:07
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

А где об этом можно почитать? Это поведение ES6 или TypeScript добавляет?
Ответить с цитированием
  #16 (permalink)  
Старый 11.08.2017, 16:14
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Сообщение от Shitbox2
А где об этом можно почитать?
в самом что ни на есть МДНе
https://developer.mozilla.org/ru/doc.../Operators/new

это стандартное js-ное поведение, существует от сотворения мира.
Ответить с цитированием
  #17 (permalink)  
Старый 11.08.2017, 16:26
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

И как это я упустил этот момент) Спасибо!
Ответить с цитированием
  #18 (permalink)  
Старый 11.08.2017, 16:57
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

Еще вопрос, чтобы новую тему не создавать. Пример из статьи: 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;

так ли нужны?

Последний раз редактировалось Shitbox2, 11.08.2017 в 17:01.
Ответить с цитированием
  #19 (permalink)  
Старый 11.08.2017, 17:40
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

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

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

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

так ли нужны?
Возможно (однако нельзя сказать наверняка), стоило обойтись таким кодом:
newConstructor.prototype = Target.prototype;
Ответить с цитированием
  #20 (permalink)  
Старый 11.08.2017, 17:52
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

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



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать tooltip для ячейки таблицы? khusamov ExtJS 7 14.04.2017 10:52
Как сделать выполнение ф-ции только для видимых объектов на экране? Randomizer jQuery 6 21.01.2013 16:06
как сделать событие для списка node. DimaRogov Events/DOM/Window 5 18.09.2011 16:52
Как сделать выпадающее меню voloxa89 jQuery 7 20.08.2011 11:27
Как сделать функцию типа toDataUrl для рисунка в ie6 ? Олег Общие вопросы Javascript 2 14.09.2008 00:06