2016-07-08 13 views
7

Ich versuche .toString() auf eine Funktion Proxy anzurufen.Funktion Proxy .toString() Fehler

Durch das einfache Erstellen eines Funktionsproxys und das Aufrufen von toString wird "TypeError: Function.prototype.toString ist nicht generisch" ausgelöst, sodass toString die Quelle der ursprünglichen Ursachen zurückgibt "RangeError: Maximale Callstackgröße überschritten", aber ein Get Trap für toString funktioniert.

Warum Einstellung nicht einfach die toString-Funktion nicht, sondern macht eine get-Falle tut?

function wrap(source) { 
 
return(new Proxy(source, {})) 
 
} 
 
wrap(function() { }).toString()

function wrap(source) { 
 
let proxy = new Proxy(source, {}) 
 
proxy.toString = function() { 
 
    return(source.toString()) 
 
} 
 
return(proxy) 
 
} 
 
wrap(function() { }).toString()

function wrap(source) { 
 
return(new Proxy(source, { 
 
    get(target, key) { 
 
    if(key == "toString") { 
 
    return(function() { 
 
    return(source.toString()) 
 
    }) 
 
    } else { 
 
    return(Reflect.get(source, key)) 
 
} } })) } 
 
wrap(function() { }).toString()

+0

bezogen werden: https: // esdiscuss. org/Thema/calling-tostring-on-Funktion-proxy-wirft-Typeerror-Ausnahme – tybro0103

+0

Unrelated: 'return' ist ein Schlüsselwort, nicht eine Funktion in sich, so dass es' Rückkehr x' nicht 'return (x)'. Der Parens macht hier nichts. – Albin

Antwort

2

TypeError: Function.prototype.toString is not generic

Scheint, wie Function.prototype.toString nicht auf Proxy zu heißen soll.

proxy.toString = function() { 

Diese Zuordnung zu Proxy wird das source Objekt übergeben, da Sie nicht für die Zuordnung haben Falle. Wenn Sie source.hasOwnProperty('toString') überprüfen werden Sie true bekommen. Wenn Sie get Falle hinzufügen, ändern Sie nicht toString Methode und fügen Sie nicht es in source Objekt, so funktioniert es.

Die andere mögliche Lösung ist

function wrap(source) { 
    let proxy = new Proxy(source, {}) 
    proxy.toString = Function.prototype.toString.bind(source) 
    return proxy 
} 
0

ich das gleiche Problem hatte. Ich habe schließlich herausgefunden, dass es ein Problem mit this ist. Fügen Sie eine get Trap an Ihren Handler, binden das Proxy-Objekt als this auf der Proxy-Eigenschaft, wenn es sich um eine function ist, und es scheint in Ordnung zu arbeiten:

function wrap(source) { 
 
    return new Proxy(source, { 
 
     get: function (target, name) { 
 
      const property = target[name]; 
 
      return (typeof property === 'function') 
 
       ? property.bind(target) 
 
       : property; 
 
     } 
 
    }); 
 
} 
 

 
console.log(wrap(function() {}).toString());