2016-08-15 7 views
0

I次のコードを持っている:Symbol.hasInstanceを関数に割り当てることができないのはなぜですか?

function A() { 
} 

A[Symbol.hasInstance] = function(i) {return true} 

それは私のWebPACK +バベル環境でのエラーで失敗します。

Uncaught TypeError: Cannot assign to read only property 'Symbol(Symbol.hasInstance)' of function 'function A() {}' 

はなぜ?

+0

:それは 'Symbol.hasInstance'が今のFirefox 50を除いては何も実装されていないように見えます。 – naomik

+0

@naomik 'Symbol.hasInstance'はChromeで実装されているようです(私はChromeの安定版v51を使用しています)。私はコンソールでそれを見ることができます。 'function A(){}; [Symbol.hasInstance] = function(){} 'はコンソールで動作します。たぶんこれはWebpack/Babel蒸散の問題ですか? – trusktr

答えて

1

理由は、Function.prototype[Symbol.hasInstance]のプロパティ記述子に{writable: false}があり、そのように割り当てることができないからです。 JSエンジンは記述子を参照し、writable: falseと表示され、プロパティが見つかった元のオブジェクトではなくプロトタイプタイプのリーフオブジェクトに割り当てられていても割り当てが禁止されます。つまり、writable: falseプロパティ値を代入しようとしているプロトタイプチェーンの最長オブジェクトにプロパティがまだ存在しない場合でも、プロトタイプ的に継承されます。

問題を回避するために、私たちは正常に動作しますObject.definePropertyを、使用することができます。

関連
function A() { 
} 

Object.defineProperty(A, Symbol.hasInstance, { 
    value: function(i) {return true} 
}) 
関連する問題