Javascript.RU

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

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

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

И как это я упустил этот момент) Спасибо!
Ответить с цитированием
  #23 (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.
Ответить с цитированием
  #24 (permalink)  
Старый 11.08.2017, 17:40
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

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

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

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

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

Цитата:
По сути, тут создается новый класс, который в точности как Target, только объекты после создания замораживаются. Потому конструктор вызывать надо.
Т.е. это эквивалентно super(args)?
Ответить с цитированием
  #26 (permalink)  
Старый 11.08.2017, 18:02
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

Да.
Ответить с цитированием
  #27 (permalink)  
Старый 11.08.2017, 18:09
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

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

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

Всё равно декоратор не работает нормально. Если делаю так, то всё ОК
function decorator(target) {
  return target
}

@decorator
class MyClass {
  public constructor( @Inject(HttpClient) protected http: HttpClient) {}
}


Но как только вместо target возвращаю в декораторе новый конструктор, DI перестает работать (сервисы не инжектятся)

P.S. Сделал планк https://embed.plnkr.co/opnY3y/

Последний раз редактировалось Shitbox2, 11.08.2017 в 20:37.
Ответить с цитированием
  #29 (permalink)  
Старый 12.08.2017, 02:57
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Сообщение от Shitbox2
Пример из статьи:
Опять какой-то кривой пример (аргументы забыли, лишнее звено в цепочке прототипов создали), везет тебе , видимо авторы знакомы с JS только по TS, и не особо разбираются как работает new. Вот поэтому, чтобы не было таких недоразумений, надо изучать JS начиная c ES5, а не с ES6, TS и тд, благо что у нас на сайте есть прекрасный Учебник на русском по ES5, с отдельной главой по ES6. Что касается TS, то получается что ищешь примеры декораторов где угодно только не на офсайте, но стоило бы начать с него decorators, playground, frameworks.
Ответить с цитированием
  #30 (permalink)  
Старый 13.08.2017, 17:28
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

Читал документацию по декораторам и смотрел как они в ES транспилятся - ничего сложного)

На stackoverflow ответили: https://stackoverflow.com/questions/...46606#45646606

Тоже пробовал что-то подобное, но оказывается нужно было newCtor делать именованной, а в конце все-таки использовать newConstructor.prototype = Object.create(target.prototype), а не newConstructor.prototype = target.prototype;

Видимо, Ангуляр как-то по-особенному свои зависимости инжектит. Вот в его исходниках так и не разобрался - слишком муторный код
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать 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