javascript 装饰器的概念问题
problem in concept of javascript decorators
我正在尝试借助这篇文章在 javascript 中学习装饰器:
https://dev.to/logrocket/understanding-javascript-decorators-ba2.
我的问题是:
- 我们怎么可能在
Validator
函数中读取 Multiply
函数的参数?
- 为什么
Multiply
参数在 Validator
函数中的 return function(...args)
之前未定义?
代码如下:
let Multiply = (...args) => {
return args.reduce((a, b) => a * b)
}
// validated integers
const Validator = (fn) => {
return function(...args) {
const validArgs = args.every(arg => Number.isInteger(arg));
if (!validArgs) {
throw new TypeError('Argument cannot be a non-integer');
}
return fn(...args);
}
}
//decorated multiply function that only multiplies integers
MultiplyValidArgs = Validator(Multiply);
MultiplyValidArgs(6, 8, 2, 10);
验证器创建并 returns 一个新函数(在正文中指定 function(...args) { ...}
)
...args
是调用时将赋予该函数的所有参数的数组。返回函数检查的正是这个参数列表(而不是 Validator
函数)
最后创建的函数将调用初始函数,作为参数给 Validator
,前提是所有参数都是数字
所以涉及三个函数:
1 初始函数Multiply
2 Validator
函数,可以创建一个包装初始函数的新函数
3 返回的函数 MultiplyValidArgs
您可以使用
我正在尝试借助这篇文章在 javascript 中学习装饰器: https://dev.to/logrocket/understanding-javascript-decorators-ba2.
我的问题是:
- 我们怎么可能在
Validator
函数中读取Multiply
函数的参数? - 为什么
Multiply
参数在Validator
函数中的return function(...args)
之前未定义?
代码如下:
let Multiply = (...args) => {
return args.reduce((a, b) => a * b)
}
// validated integers
const Validator = (fn) => {
return function(...args) {
const validArgs = args.every(arg => Number.isInteger(arg));
if (!validArgs) {
throw new TypeError('Argument cannot be a non-integer');
}
return fn(...args);
}
}
//decorated multiply function that only multiplies integers
MultiplyValidArgs = Validator(Multiply);
MultiplyValidArgs(6, 8, 2, 10);
验证器创建并 returns 一个新函数(在正文中指定 function(...args) { ...}
)
...args
是调用时将赋予该函数的所有参数的数组。返回函数检查的正是这个参数列表(而不是 Validator
函数)
最后创建的函数将调用初始函数,作为参数给 Validator
,前提是所有参数都是数字
所以涉及三个函数:
1 初始函数Multiply
2 Validator
函数,可以创建一个包装初始函数的新函数
3 返回的函数 MultiplyValidArgs
您可以使用