面试题答案
一键面试实现思路
- 使用Proxy代理函数:通过
Proxy
创建对函数的代理,拦截函数的调用操作,从而实现动态修改函数行为。 - 参数验证:在代理的
apply
方法中对传入的参数进行验证,确保函数调用时参数符合预期。 - 动态修改行为:根据不同的条件或配置,在
apply
方法中改变函数的实际执行逻辑。 - 利用Reflect:
Reflect
提供了与Proxy
拦截操作相对应的方法,用于更方便地执行原始函数调用等操作。
代码示例
// 原始函数
function originalFunction(a, b) {
return a + b;
}
// 代理处理函数
const handler = {
apply(target, thisArg, argumentsList) {
// 参数验证
if (!Array.isArray(argumentsList) || argumentsList.length < 2) {
throw new Error('需要至少两个参数');
}
const [a, b] = argumentsList;
if (typeof a!== 'number' || typeof b!== 'number') {
throw new Error('参数必须为数字');
}
// 动态修改行为,例如这里增加一个固定值
const modifiedA = a + 10;
const modifiedB = b + 10;
// 使用Reflect调用原始函数
return Reflect.apply(target, thisArg, [modifiedA, modifiedB]);
}
};
// 创建代理函数
const proxyFunction = new Proxy(originalFunction, handler);
// 调用代理函数
console.log(proxyFunction(1, 2)); // 输出:23
在上述示例中,通过Proxy
创建了对originalFunction
的代理,在代理的apply
方法中实现了参数验证,并动态修改了函数行为,通过Reflect.apply
调用原始函数。这样就实现了对函数定义的优化,具备元编程功能。