Ну так то да. Но тогда if (length > args.length) return; потому что можно передать левый мусор в отсутствующие аргументы и это будет ок.)
|
Я попытался повозиться с твоим скриптом, адаптировать его для собственных нужд. Работает нормально. Но столкнулся с небольшой неувязкой.
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 сек на миллион вызовов. |
Дык, всё в туду списке указано.
1. Решается обработкой по порядку, т.е. напишешь так: voraa, [ {par2: isArray}, {par1: isObject, 'par2?': isArray} ] И если первое прошло, на второе не пойдёт. Там чутка поправить надо, убрать flatmap и добавить ещё один цикл.) Ну и isPlainObject. 2. Кэширование. Как в рамках одного вызова, так и в рамках всех вызовов в таске. Ну и 50 раз оверхед над пустой функцией не особо страшен, потому что он статичен. Возьми функцию по-тяжелее и процент оверхеда уменьшится.) А для особо критичных ситуаций - надо предусмотреть возможность вызова оригинальной функции. 3. super и не будет работать в функциях, а если ты обернёшь метод и положишь его обратно - всё будет норм. |
Цитата:
Это все прокатывает только для статических методов. И что бы пользоваться 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); ..... } |
Вообще всегда так делали, коли надо:
constructor(){ super(); this.method = withAttrs(this.method); } Ток в ts, такое не прокатит, да. |
Цитата:
И в обычном js это как то не так. Методы должны быть в прототипе, а не в объекте. |
voraa, ну
A.prototype.method = withAttrs(A.prototype.method);тож сработает. А ts тут при том что очень не любит когда классы трогают уже после декларации.) |
Часовой пояс GMT +3, время: 23:15. |