javascript - 如何创建一个包罗万象的对象代理?
问题描述
我想创建一个代理对象来拦截所有属性检索和函数调用,并返回undefined
.
完成前者是微不足道的:
const proxy = new Proxy({}, { get: () => undefined });
proxy.foo // undefined
事实上,我什至不需要代理,一个空对象 ( {}
) 也会这样做。但是,对函数调用执行相同操作会引发错误:
proxy.foo() // TypeError: proxy.foo is not a function
我可以让get
陷阱返回一个函数:
const proxy = new Proxy({}, { get: () => () => undefined });
proxy.foo() // undefined
proxy.foo // [Function]
但正如您所看到的,它将返回一个函数,而不是undefined
我原来的属性访问案例。有没有可能完成我想要的?
const proxy = ???;
proxy.foo; // undefined
proxy.foo(); // undefined
最终目标是将其用作测试的“包罗万象”存根。
更新: 感谢@Bergi 的回答。以下代码完成了我想要的:
const proxy = new Proxy(new Function, {
get: (target, prop, receiver) => receiver,
});
console.log('proxy.foo', proxy.foo); // undefined
console.log('proxy.foo()', proxy.foo()); // undefined
console.log('proxy.foo.bar', proxy.foo.bar); // undefined
console.log('proxy.foo.bar()', proxy.foo.bar()); // undefined
解决方案
不,这是不可能的。代理不拦截方法调用,它只能拦截对代理本身的调用(如proxy()
)。方法调用只是属性访问,然后是对属性值的函数调用。而且不可能有一个既是undefined
函数又是函数的值。
为了有一个真正的包罗万象的存根进行测试,你的代理应该为任何访问或调用返回自己(或者更好的是另一个代理),这样你就可以拥有任意链。
推荐阅读
- azure - 使用 powershell 部署 ARM 模板:即使已定义订阅 ID,也要询问它
- python - 遍历多索引
- solr - 在 apache solr 云中索引巨大的表记录
- angularjs - 将数据发送到 AngularJS 中的另一个控制器
- python - 如何将用户输入的字符串存储在变量中,然后查看这些输入是否包含在单词中
- c# - CodeBehind 中 DataGrid 列的元素样式无效
- java - Neo4j 3.5 Java 嵌入式。如何增加堆大小?
- django - Django:模型无法在管理员中正确呈现字段
- javascript - React JS如何用日期和数字转换这个对象数组?
- sql - 如何优化 SQL Server 表上的索引