8

関数プロキシで .toString() を呼び出そうとしています。

関数プロキシを作成して toString を呼び出すだけで「TypeError: Function.prototype.toString is not generic」が発生し、toString を元のソースを返すように設定すると「RangeError: Maximum call stack size exceeded」が発生しますが、toString の get トラップが作成されます。動作します。

toString 関数を設定するだけでは機能しないのに、get トラップを作成すると機能するのはなぜですか?

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

4

2 に答える 2

1

TypeError: Function.prototype.toString はジェネリックではありません

Function.prototype.toStringは呼び出されないようですProxy

proxy.toString = function() {

source割り当て用のトラップがないため、このプロキシへの割り当てはオブジェクトに渡されます。チェックsource.hasOwnProperty('toString')すると、 が得られますtruegetトラップを追加するときは、メソッドを変更せず、オブジェクトにtoString追加しないため、機能します。source

他の可能な解決策は

function wrap(source) {
  let proxy = new Proxy(source, {})
  proxy.toString = Function.prototype.toString.bind(source)
  return proxy
}
于 2016-07-11T22:27:38.407 に答える