Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите пожалуйста, если можно с объяснением (https://javascript.ru/forum/misc/83414-pomogite-pozhalujjsta-esli-mozhno-s-obyasneniem.html)

Aetae 06.12.2021 05:19

Ну так то да. Но тогда if (length > args.length) return; потому что можно передать левый мусор в отсутствующие аргументы и это будет ок.)

voraa 06.12.2021 06:44

Я попытался повозиться с твоим скриптом, адаптировать его для собственных нужд. Работает нормально. Но столкнулся с небольшой неувязкой.
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 сек на миллион вызовов.

Aetae 06.12.2021 07:19

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

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

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

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

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

voraa 06.12.2021 08:20

Цитата:

Сообщение от 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);
   .....
}

Aetae 06.12.2021 09:03

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

Ток в ts, такое не прокатит, да.

voraa 06.12.2021 10:44

Цитата:

Сообщение от Aetae
Ток в ts, такое не прокатит, да.

ts тут ни при чем.
И в обычном js это как то не так.
Методы должны быть в прототипе, а не в объекте.

Aetae 06.12.2021 14:31

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


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