2016-07-14 121 views
7

Per esempio, se ho questo gestore/proxy (dal MDN example) ...Come ottenere il gestore del proxy dall'oggetto proxy?

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 

è possibile sondare il proxy, p, in qualche modo che mi permette di ottenere l'oggetto handler indietro.

Qualcosa lungo le linee di:

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

Ovviamente, le varie trappole impostati nel gestore sono ancora "conosciuto" al proxy, ma c'è un modo chiara di restituirli/la gestore dal proxy stesso? Se é cosi, come?

Al momento non ho un caso d'uso specifico, ma potrei vederlo utile se volessi cambiare dinamicamente un gestore/trappole dopo che hai già un proxy.

+0

Dovete chiedere gentilmente. Se il proxy definisce una proprietà '__handler__', risponderà alla tua richiesta. – Bergi

+0

È piuttosto il punto delle proxy che i consumatori non sono autorizzati a controllarlo in quel modo, dovrebbero trattarlo come qualsiasi altro oggetto. Se sei il creatore del proxy, è piuttosto banale mantenere un riferimento al 'handler' – Bergi

+0

@Bergi, è strano per me che il" punto di proxy "sia richiesto dallo standard in quel modo. Penso che idealmente sarebbe responsabilità del creatore del proxy dichiarare il proxy pubblico/esposto o privato, anche se il 95% delle volte la risposta "giusta" è che i consumatori non possono ispezionarlo/aumentarlo. –

risposta

7

ECMAScript non fornisce alcun modo per accedere agli slot interni [[ProxyHandler]] né [[ProxyTarget]].

Alcune implementazioni possono fornire alcuni modi non standard, ma non lo danno per scontato.

Per esempio, su Firefox codice privilegiato, si può sapere se un oggetto è un proxy utilizzando

Components.utils.isProxy(object); 

ho proposto attuare metodi simili a esporre il [[ProxyHandler]] e [[ProxyTarget]]. Mi hanno detto di implementarli in Debugger.Object anziché Components.utils.

Quando le terre delle patch, sarà possibile usare qualcosa come

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

E che dire di CHrome? – Pacerier