【发布时间】:2016-07-14 23:04:38
【问题描述】:
例如,如果我有这个处理程序/代理(来自MDN example)...
var handler = {
get: function(target, name){
return name in target?
target[name] :
37;
}
};
var p = new Proxy({}, handler);
p.a = 1;
p.b = undefined;
console.log(p.a, p.b); // 1, undefined
console.log('c' in p, p.c); // false, 37
是否有可能以某种方式探测代理 p,让我找回 handler 对象。
类似的东西:
p.__handler__ // returns handler object -> Object {get: handler.get(), set: handler.set(), ...}
p.__handler__.get // returns get prop/fn of handler -> function(target, name){ ...}
显然,在处理程序中设置的各种陷阱对于代理来说仍然是“已知的”,但是是否有一种明确的方法可以从代理本身返回它们/处理程序?如果有,怎么做?
目前我没有这方面的具体用例,但如果您想在已有代理后动态更改处理程序/陷阱,我可以看到这很有用。
【问题讨论】:
-
你得问好。如果代理确实定义了
__handler__属性,它将响应您的请求。 -
代理的重点是不允许消费者那样检查它,他们应该像对待任何其他对象一样对待它。如果您是代理的创建者,那么保留对
handler的引用相当简单 -
@Bergi,令我感到奇怪的是,标准以这种方式强制要求“代理点”。我认为理想情况下,代理的创建者有责任将代理声明为公开/公开或私有,即使 95% 的“正确”答案是消费者无法检查/增强它。
-
是的,确切地说,代理创建者可以公开处理程序 - 如果需要,只需执行
new Proxy({__handler__: handler}, handler)。默认情况下它不会公开,因为 95% 的情况是不需要的。 -
@Bergi,啊,我明白你现在的意思了。从您的原始评论中,我并不明显。请考虑添加/扩展您的想法作为答案。我认为您所说/暗示的关于故意隐藏代理的内容很有见地,而您的解决方案使其成为可能非常相关,并且可能也非常适用于任何想知道这一点的人。
标签: javascript ecmascript-6 es6-proxy