Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 04.08.2017, 12:27
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

Никуда не пропадают, это я неправильную реализацию написал. Если делать так, то всё работает:
function logClass(target: any) {

  // сохраняем ссылку на исходный конструктор
  var original = target;

  // вспомогательная функция для генерации экземпляров класса
  function construct(constructor, args) {
    var c : any = function () {
      return constructor.apply(this, args);
    }
    c.prototype = constructor.prototype;
    return new c();
  }

  // новое поведение конструктора
  var f : any = function (...args) {
    console.log("New: " + original.name); 
    return construct(original, args);
  }

  // копируем прототип, чтобы работал оператор instanceof
  f.prototype = original.prototype;

  // возвращаем новый конструктор (он переопределит исходный)
  return f;
}
Ответить с цитированием
  #12 (permalink)  
Старый 04.08.2017, 15:24
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Сообщение от Shitbox2
Если делать так, то всё работает
Если всё работает значит неправильно сформулировали вопрос. Ваша задача была "для класса ... определять его методы ... динамически ... в стиле ES6 ... без декораторов". А вы привели декоратор конструктора ES5 https://gist.github.com/remojansen/16c661a7afd68e22ac6e, это пример из книги, найдите ее и почитайте для чего это надо. И определять методы в конструкторе и вне конструктора это не тоже самое, почитайте где-нибудь в чем разница.
Ответить с цитированием
  #13 (permalink)  
Старый 04.08.2017, 16:48
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

Пример декоратора, который я привел, не относится к задаче (т.е. он не участвует в определении методов). Просто я тестировал своё решение в т.ч. со сторонними декораторами, чтобы убедиться, что всё работает как надо.

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

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

class Dog {
  bulk = CreateMethod({name: 'bulk', volume: 90})
}
если верить плейграунду, то bulk создается в конструкторе.
на каждый экземпляр - новый метод. При том что тут не нужны данные из экземпляра.
если экземпляров много, таки лучше через прототип. Конечно, выглядит совсем не по-хипстерски, зато правильнее
Ответить с цитированием
  #15 (permalink)  
Старый 04.08.2017, 18:42
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Shitbox2,
Если вы в TS определяете методы так:
class Dog {
    bulk = CreateMethod({name: 'bulk', volume: 90})
}

то это тоже само что в TS/ES6 сделать так:
class Dog {
    constructor() {
        this.bulk = CreateMethod({name: 'bulk', volume: 90});
    }
}

и это совсем не тоже самое что в TS/ES6 сделать так:
class Dog {
    bulk() { ... }
}

Что касается примера декоратора, имхо автор книги что-то попутал и изобрел лишнюю функцию construct, без нее работает также:
function logClass(target: any) {

  // сохраняем ссылку на исходный конструктор
  var original = target;

  // новое поведение конструктора
  var f : any = function (...args) {
    console.log("New: " + original.name); 
    return new original(...args);
  }

  // копируем прототип, чтобы работал оператор instanceof
  f.prototype = original.prototype;

  // возвращаем новый конструктор (он переопределит исходный)
  return f;
}

@logClass
class Person { 

  public name: string;
  public surname: string;

  constructor(name : string, surname : string) { 
    this.name = name;
    this.surname = surname;
  }
}

var p = new Person("remo", "jansen");

Еще короче, работает также:
class Person { 

  public name: string;
  public surname: string;

  constructor(name : string, surname : string) { 
    console.log("New: " + this.constructor.name);
    this.name = name;
    this.surname = surname;
  }
}

var p = new Person("remo", "jansen");

Бессмысленный декоратор какой-то... есть подозрение что автор книги хотел отнаследовать оригинальный конструктор в прототип... но что-то пошло не так)

Последний раз редактировалось Rise, 04.08.2017 в 19:17.
Ответить с цитированием
  #16 (permalink)  
Старый 06.08.2017, 04:02
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

Учитывая, что это всё используется в Ангуляре (кто-то использует TS по-другому? ;-), а сервисы там преимущественно синглтоны, то копировать свойства в конструкторе нормально... Не понимаю, зачем ангуляровцы, вообще, ООП используют при таком раскладе
Ответить с цитированием
  #17 (permalink)  
Старый 07.08.2017, 00:52
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Сообщение от Shitbox2
используется в Ангуляре (кто-то использует TS по-другому? ;-)
Вы можете разрабатывать на TS всё что угодно, не Ангуляр его придумал и не для него его придумали.
Ответить с цитированием
  #18 (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 таких примеров нет
Ответить с цитированием
  #19 (permalink)  
Старый 11.08.2017, 15:37
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

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

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



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

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


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