例如,如果我有这个处理程序/代理(来自 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){ ...}
显然,在处理程序中设置的各种陷阱对于代理来说仍然是“已知的”,但是是否有一种明确的方式从代理本身返回它们/处理程序?如果是,怎么做?
目前我没有这方面的具体用例,但如果您想在已经拥有代理后动态更改处理程序/陷阱,我认为这很有用。
最佳答案
ECMAScript 不提供访问内部 [[ProxyHandler]] 或 [[ProxyTarget]] 槽的方法。
一些实现可能会提供一些非标准的方式,但不要想当然。
例如,在 Firefox 特权代码上,您可以使用以下方法知道对象是否是代理
Components.utils.isProxy(object);
我建议实现类似的方法来公开 [[ProxyHandler]] 和 [[ProxyTarget]]。他们告诉我在 Debugger.Object
而不是 Components.utils
中实现它们。
补丁落地后,就可以使用类似的东西了
Components.utils.import('resource://gre/modules/jsdebugger.jsm');
var Cc = Components.classes;
// Add a debugger to a new global
var global = new Components.utils.Sandbox(
Cc["@mozilla.org/systemprincipal;1"].createInstance(Ci.nsIPrincipal),
{ freshZone: true }
);
addDebuggerToGlobal(global);
var dbg = new global.Debugger().addDebuggee(this);
// Create a debugger object of your object, and run proxy getters
var dbgObj = dbg.makeDebuggeeValue(object);
if(dbgObj.isProxy) { // a boolean
dbgObj.proxyHandler.unsafeDereference(); // the [[ProxyHandler]]
dbgObj.proxyTarget.unsafeDereference(); // the [[ProxyTarget]]
}
关于javascript - 如何从代理对象获取代理的处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38385561/