2016-07-08 27 views
7

Bir işlev proxy'sinde .toString() öğesini çağırmaya çalışıyorum.İşlev Proxy .toString() Hatalar

Sadece bir işlev vekilinin yaratılması ve toString çağrılması, "TypeError: Function.prototype.toString jenerik değil" nedeniyle, "RangeError: Maksimum çağrı yığını boyutu aşıldı" şeklindeki orijinal nedenlerin kaynağını döndürmek için toString öğesinin ayarlanması, ancak bir toString işleri için tuzak olsun.

toString işlevini ayarlamak neden işe yaramıyor, ancak bir tuzak oluşturuyor?

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

related: https: // esdiscuss. org/topic/call-tostring-on-function-proxy-throws-typeerror-exception – tybro0103

+0

Bağlantısız: 'return' bir anahtar sözcüktür, kendi başına bir işlev değildir, bu yüzden' return x' 'return (x)' değil. Parens burada hiçbir şey yapmıyor. – Albin

cevap

2

TypeError: Function.prototype.toString is not generic

Function.prototype.toString'un Proxy numaralı telefonlarda aranmaması gerekiyor. Eğer atama için tuzak yok gibi

proxy.toString = function() { 

proxy Bu ödev

source nesneye geçirilir. source.hasOwnProperty('toString')'u kontrol ederseniz, true elde edersiniz. get trap eklediğinizde, toString yöntemini değiştirmezsiniz ve source nesnesine eklemezsiniz, bu nedenle çalışır.

diğer olası çözüm Ben aynı sorunu yaşıyordu

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

olduğunu. Sonunda, bunun this ile ilgili bir sorun olduğunu anladım. Senin işleyicisi için bir get tuzak ekle bir function ise vekalet mülkiyet this olarak vekalet nesneyi bağlamak ve sorun yok iş gibi görünüyor:

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());