Ну так то да. Но тогда 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, время: 17:54. |