Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 06.12.2021, 05:19
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,480

Ну так то да. Но тогда if (length > args.length) return; потому что можно передать левый мусор в отсутствующие аргументы и это будет ок.)
__________________
29375, 35
Ответить с цитированием
  #22 (permalink)  
Старый 06.12.2021, 06:44
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,692

Я попытался повозиться с твоим скриптом, адаптировать его для собственных нужд. Работает нормально. Но столкнулся с небольшой неувязкой.
return func.call(this, findArgs(args, bigList));
предполагает, что функция может быть и методом.
Но super из нее не вызовешь.

С проверками типов тоже приходится быть очень аккуратным
[
{par1: isObject, 'par2?': isArray},
{par2: isArray}
]

isObject просто как o => typeof o === 'object' не сделаешь
Надо o => typeof o === 'object' && !Array.isArray(o)
Ну и других подобных ситуаций хватало. Поэтому проверки типов иногда становятся довольно громоздкими

Меня такие коды бросают в дрожь из-за цены вызова функции по времени.
Провел тестирование
Вызывал 1 000 000 раз обычную функцию (но пустую) и делал вызов с такими проверками параметров.
С одной стороны разница по времени в 50 раз!
С другой стороны 0.6 сек на миллион вызовов.

Последний раз редактировалось voraa, 06.12.2021 в 06:59.
Ответить с цитированием
  #23 (permalink)  
Старый 06.12.2021, 07:19
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,480

Дык, всё в туду списке указано.
1. Решается обработкой по порядку, т.е. напишешь так:
voraa,
[
{par2: isArray},
{par1: isObject, 'par2?': isArray}
]
И если первое прошло, на второе не пойдёт. Там чутка поправить надо, убрать flatmap и добавить ещё один цикл.)
Ну и isPlainObject.

2. Кэширование. Как в рамках одного вызова, так и в рамках всех вызовов в таске.

Ну и 50 раз оверхед над пустой функцией не особо страшен, потому что он статичен. Возьми функцию по-тяжелее и процент оверхеда уменьшится.)

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

3. super и не будет работать в функциях, а если ты обернёшь метод и положишь его обратно - всё будет норм.
__________________
29375, 35

Последний раз редактировалось Aetae, 06.12.2021 в 07:28.
Ответить с цитированием
  #24 (permalink)  
Старый 06.12.2021, 08:20
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,692

Сообщение от Aetae
а если ты обернёшь метод и положишь его обратно - всё будет норм.
Не там вообще все непросто
Это все прокатывает только для статических методов. И что бы пользоваться super приходится делать два метода - не обернутый и обернутый

class A extends B {
....
static f ({args...}) {
 super.f()
}
static fwa = withAttrs(f, [...])
}

просто
static f = withAttrs(function ({args}) {
 super.f() // !!!
}, [.....])

не сделаешь

А не статический метод просто в классе не сделать, только через прототип туда его пихать

Приходит в голову мысль получать то, что bigList отдельно, а саму функцию метод оформлять так

method (...args) {
   let {par1, par2, par3} = findArgs(args, bigList);
   .....
}

Последний раз редактировалось voraa, 06.12.2021 в 08:40.
Ответить с цитированием
  #25 (permalink)  
Старый 06.12.2021, 09:03
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,480

Вообще всегда так делали, коли надо:
constructor(){
  super();
  this.method = withAttrs(this.method); 
}

Ток в ts, такое не прокатит, да.
__________________
29375, 35
Ответить с цитированием
  #26 (permalink)  
Старый 06.12.2021, 10:44
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,692

Сообщение от Aetae
Ток в ts, такое не прокатит, да.
ts тут ни при чем.
И в обычном js это как то не так.
Методы должны быть в прототипе, а не в объекте.
Ответить с цитированием
  #27 (permalink)  
Старый 06.12.2021, 14:31
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,480

voraa, ну
A.prototype.method = withAttrs(A.prototype.method);
тож сработает.
А ts тут при том что очень не любит когда классы трогают уже после декларации.)
__________________
29375, 35
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Управление скроллом "а-ля тач" HonesT Элементы интерфейса 2 27.08.2013 14:25
Помогите пожалуйста вычислить общую сумму katalizator Общие вопросы Javascript 15 22.03.2013 16:26
Помогите пожалуйста, очень срочно!!! PAMAC AJAX и COMET 1 20.10.2009 23:38
можно ли, если да то как удалить строки из таблицы Avaria Я не знаю javascript 3 11.06.2009 03:03
Помогите, пожалуйста zashibis Общие вопросы Javascript 1 02.12.2008 14:07