2016-07-14 12 views
7

Zum Beispiel, wenn ich diesen Handler/Proxy (vom MDN example) ...Wie bekomme ich Proxy-Handler vom Proxy-Objekt?

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 

ist es möglich, den Proxy zu sondieren, p, in irgendeiner Weise, die mich zurück handler Objekt erhalten können.

Etwas entlang der Linien von:

p.__handler__ // returns handler object -> Object {get: handler.get(), set: handler.set(), ...} 
p.__handler__.get // returns get prop/fn of handler -> function(target, name){ ...} 

Offensichtlich sind die verschiedenen Fallen im Handler eingerichtet sind noch „bekannt“ an den Proxy, aber gibt es eine klare Möglichkeit, sie zurückzubringen/das Handler vom Proxy selbst? Wenn das so ist, wie?

Ich habe im Moment keinen spezifischen Anwendungsfall, aber ich könnte sehen, dass dies nützlich ist, wenn Sie einen Handler/Traps dynamisch ändern möchten, nachdem Sie bereits einen Proxy haben.

+0

Sie haben zu verwenden, freundlich zu fragen. Wenn der Proxy eine Eigenschaft "__handler__" definiert, wird er auf Ihre Anfrage antworten. – Bergi

+0

Es ist ziemlich der Punkt von Proxies, dass Verbraucher es nicht so kontrollieren dürfen, sie sollten es wie jedes andere Objekt behandeln. Wenn Sie der Ersteller des Proxys sind, ist es eher trivial, einen Verweis auf den 'Handler' zu behalten. – Bergi

+0

@Bergi, es ist komisch für mich, dass der" Point of Proxies "vom Standard auf diese Weise vorgeschrieben wird. Ich denke, idealerweise würde es die Verantwortung des Erstellers des Proxys sein, den Proxy öffentlich/exponiert oder privat zu deklarieren, selbst wenn 95% der Zeit die "richtige" Antwort lautet, dass die Verbraucher sie nicht inspizieren/erweitern können. –

Antwort

7

ECMAScript bietet keine Möglichkeit, auf die internen [[ProxyHandler]] - oder [[ProxyTarget]] - Steckplätze zuzugreifen.

Einige Implementierungen bieten einige nicht standardmäßige Möglichkeiten, aber nicht als selbstverständlich.

Zum Beispiel auf Firefox privilegierten Code, können Sie wissen, ob ein Objekt ein Proxy ist mit

Components.utils.isProxy(object); 

I ähnlichen Verfahren vorgeschlagen Umsetzung des [[ProxyHandler]] und [[ProxyTarget]] zu belichten. Sie sagten mir, sie in Debugger.Object anstelle von Components.utils zu implementieren.

Wenn der Patch landet, wird es möglich sein, so etwas wie

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]] 
} 
+0

Und was ist mit CHrome? – Pacerier

Verwandte Themen