函数代理.toString()错误

Dan*_*err 7 javascript tostring ecmascript-6 es6-proxy

我试图在函数代理上调用.toString().

简单地创建一个函数代理并调用toString导致"TypeError:Function.prototype.toString不是通用的",将toString设置为返回原始源会导致"RangeError:超出最大调用堆栈大小",但为toString创建一个get陷阱作品.

为什么简单地设置toString函数不起作用,但是设置get陷阱呢?

function wrap(source) {
 return(new Proxy(source, {}))
}
wrap(function() { }).toString()
Run Code Online (Sandbox Code Playgroud)

function wrap(source) {
 let proxy = new Proxy(source, {})
 proxy.toString = function() {
  return(source.toString())
 }
 return(proxy)
}
wrap(function() { }).toString()
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

Ste*_*let 6

我遇到了同样的问题。我终于发现这是this. get向您的处理程序添加一个陷阱,this如果它是 a 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());
Run Code Online (Sandbox Code Playgroud)


Qwe*_*tiy 2

类型错误:Function.prototype.toString 不是泛型

看来Function.prototype.toString不应该被召唤Proxy

proxy.toString = function() {
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)