javascript - 如何从代理对象获取代理的处理程序?

标签 javascript ecmascript-6 es6-proxy

例如,如果我有这个处理程序/代理(来自 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/

相关文章:

javascript - 如何仅使用 javascript 更改按钮颜色 onclick?

javascript - 使用babel-node调试ES6 Node.js应用程序

javascript - 如何删除代理创建的对象的属性?

javascript - 是否可以使用代理 JavaScript 对象来 'trap' 用户通过在获取信息/数据之前清空该对象来查找其属性/值?

javascript - chalk.bgHex 不是函数

javascript - 在普通 Node 中实现队列的好方法是什么?

javascript - 以编程方式调用对象中的所有函数? (JavaScript)

javascript - UglifyJS webpack 插件抛出 : Unexpected token: name (features)

javascript - 使用带有普通数组的代理

JavaScript 杂技 : This code uses eval, 怎么去掉呢?