2016-07-08 6 views
7

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

単純に関数プロキシを作成してtoStringを呼び出すと、 "TypeError:Function.prototype.toStringが汎用ではありません"が発生し、元のソースを返すようにtoStringを設定すると "RangeError:最大呼び出しスタックサイズを超えました" toStringのトラップを取得します。

なぜ単純に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()

+0

ます。https:// esdiscuss。 – tybro0103

+0

無関係: 'return'はキーワードであり、それ自身の関数ではないので、' return x'ではなく 'return(x)'です。 parensはここで何もしません。 – Albin

答えて

2

TypeError: Function.prototype.toString is not generic

Function.prototype.toStringのようなものは、Proxyで呼び出されるはずです。

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トラップを追加し、それはfunctionだ場合、プロキシプロパティ上thisとしてプロキシオブジェクトをバインドし、大丈夫に動作するようです:関連

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

関連する問題