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)
我遇到了同样的问题。我终于发现这是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)
类型错误:Function.prototype.toString 不是泛型
看来Function.prototype.toString不应该被召唤Proxy。
Run Code Online (Sandbox Code Playgroud)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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1520 次 |
| 最近记录: |