2015-09-02 10 views
9

ich ein Proxy-Objekt mit einer „anwenden“ Falle erstellt:kann nicht eingestellt „anwenden“ Trap Proxy-Objekt

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

Daher ist das Proxy-Objekt aufrufbar sein sollte. Es funktioniert jedoch nicht:

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

Warum?

+0

vielleicht verwandt: [Making ein Objekt (nicht) aufrufbar] (http://stackoverflow.com/q/29680473/1048572) – Bergi

Antwort

19

Nach der Definition des [[Call]] internal method of Proxy objects sollte es funktionieren:

Allerdings gibt es ein Problem: Nicht alle Proxy-Objekte haben die [[Aufruf]] Methode:

Ein Proxy exotisches Objekt hat nur einen [[Aufruf]] interne Methode, wenn die Anfangswert seiner [[ProxyTarget]] internal slot ist ein Objekt, das eine interne Methode [[Call]] hat.

Daher muss das Ziel ein Funktionsobjekt sein:

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

Bitte beachte, dass ich target mit einem Pfeil Funktion, um ein Funktionsobjekt zu erstellen definiert, die nicht eine Konstruktorfunktion ist. Auf diese Weise kann das Proxy-Objekt zwar aufgerufen, aber nicht instanziiert werden.

Wenn Sie auch eine "Konstrukt" -Falle hinzufügen möchten, muss das Ziel eine [[Construct]] - Methode haben, also definieren Sie es mit einer Funktionsdeklaration oder einem Funktionsausdruck.