2016-07-08 47 views
7

我想在函數代理上調用.toString()。函數代理.toString()錯誤

只需創建一個函數代理和調用toString導致「類型錯誤:Function.prototype.toString是不通用的」,設置了toString返回原來的原因「的RangeError:最大調用堆棧大小超出」的來源,但創建爲toString工作獲得陷阱。

爲什麼簡單地設置toString函數不起作用,但是做出陷阱呢?

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

相關:https://開頭esdiscuss。 org/topic/calling-tostring-on-function-proxy-throws-typeerror-exception – tybro0103

+0

不相關:'return'是一個關鍵字,本身不是函數,所以它是'return x'而不是'return(x)'。 parens在這裏沒有做任何事情。 – Albin

回答

2

TypeError: Function.prototype.toString is not generic

似乎不應該在Proxy上調用Function.prototype.toString

proxy.toString = function() { 

由於您沒有賦值陷阱,因此將此代理轉讓傳遞給source對象。如果你檢查source.hasOwnProperty('toString')你會得到true。當您添加get陷阱時,您不會更改toString方法,也不會將其添加到source對象中,因此它可以正常工作。

其他可能的解決方案是

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

我有同樣的問題。我終於發現這是this的問題。一個get陷阱添加到您的處理,代理對象爲this綁定的代理財產,如果它是一個function,它似乎好工作:

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