2015-09-02 9 views
9

ho creato un oggetto proxy con una trappola "applicare":Impossibile impostare "apply" trappola per Proxy oggetto

var target = {}, 
    handler = { apply:() => 42 } 
    proxy = new Proxy(target, handler); 

Pertanto, l'oggetto Proxy dovrebbe essere callable. Tuttavia, non funziona:

proxy(); // TypeError: proxy is not a function 

Perché?

+0

forse correlato: [Creazione di un oggetto (non-) richiamabile] (http://stackoverflow.com/q/29680473/1048572) – Bergi

risposta

19

Secondo la definizione del [[Call]] internal method of Proxy objects dovrebbe funzionare:

Tuttavia, c'è un problema: non tutti gli oggetti Proxy hanno la [[Chiamata]] metodo:

Un oggetto esotici proxy solo ha un [[Chiamata]] metodo interno se il valore iniziale [[ProxyTarget]] internal slot è un oggetto che ha un metodo interno [[Call]].

Pertanto, il bersaglio deve essere un oggetto funzione:

var target =() => {}, 
    handler = { apply:() => 42 } 
    proxy = new Proxy(target, handler); 
proxy(); // 42 

noti che ho definito target utilizzando una funzione freccia in modo da creare un oggetto funzione che non è una funzione di costruzione. In questo modo l'oggetto Proxy può essere chiamato ma non istanziato.

Se si desidera aggiungere anche una trappola "costrutto", la destinazione deve avere un metodo [[Costruisci]], quindi definirlo con una dichiarazione di funzione o espressione di funzione.

Problemi correlati