2017-09-28 8 views
-1

を使用して:シンボルターゲットオブジェクトからプロパティを取得し、次のコードを使用してES6プロキシオブジェクト

const assrt = function() { 
    try { 
     return chaiAssert.apply(null, arguments); 
    } 
    catch (e) { 
     return handleError(e); 
    } 
    }; 

v.assert = new Proxy(assrt, { 
    get: function (target, prop) { 

     if(typeof prop === 'symbol'){ 
     // I don't know what to do with symbols, so return 
     return Reflect.get(...arguments); 
     } 

     // but here! we still get properties that don't exist 
     if(!chaiAssert[prop]){ 
     return handleError(
      new Error(`The assertion library used does not have '${prop}' property or method.`) 
     ); 
     } 

     return function() { 
     try { 
      return chaiAssert[prop].apply(null, arguments); 
     } 
     catch (e) { 
      return handleError(e); 
     } 
     } 
    } 
    }); 

を、私はこのコードを取得するエラーは次のとおりです。

TypeError: Cannot convert a Symbol value to a string

、これは上の発生ライン:

new Error(`The assertion library used does not have '${prop}' property or method.`)); 

私は前にプロキシを使用している、と私はのProxのgetメソッドに渡されるシンボルを見たことがありませんy。誰もがこの問題を回避する方法を知っていますか?

なぜシンボルがプロキシget関数に渡され、それを適切に処理するのですか?

+0

get関数に送信されるプロップは 'Symbol(util.inspect.custom)'です。他にも送信されるものがあると思います。 –

+0

私は、コードをデバッグする必要があると思います。シンボルが 'if(typeof prop === 'symbol'){'によってフィルタリングされなくてはならないようです。 – Qwertiy

答えて

1

Why are Symbols being passed to the Proxy get function?

私たちは、あなたが実際にプロキシ使用するすべてのコードを示さなかった、知りません。しかし、多くのシンボルは組み込みメソッドによってアクセスされます。プロキシを反復処理するときは、Symbol.iteratorメソッドを使用します。

and how do I properly handle that?

シンボルを文字列に連結することはできません。これについては明示する必要があります。 prop.toString()のいずれかを使用するか、typeof propに基づいてスイッチするだけです。

+0

あなたはtypeof prop –

+0

'typeof prop ==" symbol "をオンに切り替えることによって何を意味するのかを実証できますか? "Symbol [" + prop.toString()+ "]":prop "またはシンボルで何をしたいかを指定します。たぶんあなたのプロキシハンドラでそれらを完全に無視し、デフォルトの 'Reflect.get'で応答してください。 – Bergi

+0

ええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええ、 –

関連する問題