2016-08-18 3 views
2

は、次の2つのスニペットを考えてみましょ機能は動作しません:よく知られている記号は、

obj = {}; // can be [], Number(), eg. but not Function() 
obj[Symbol.hasInstance] =() => console.log('89'); 
({}) instanceof obj; 

obj = function() {}; // new Function() too 
obj[Symbol.hasInstance] =() => console.log('89'); 
({}) instanceof obj; 

は両だけ最初のスニペットに「89」が記録された「89」をログに記録する必要があります。

Chrome 52では、最初のログは89、2番目のログは何も記録されません。

ノードv6.3.1では、最初にTypeError: Expecting a function in instanceof check, but got #<Object>になりますが、2番目には何も記録されません。

これはバグですか?意図した動作は何ですか? MDNにはこれを説明するものは何もない。機能の

+1

仕様は、「このプロパティは書き込み不可能であり、バインドされた関数のターゲット関数をグローバルに公開するために使用される改ざんを防ぐために構成できません」* *しかし、「コンストラクタ関数は、オブジェクトは、関数上で異なる@@ hasInstanceメソッドを公開することによって 'instanceof'によってそのインスタンスとして認識されます。* * http://www.ecma-international.org/ecma-262/7.0/#[email protected] @hasinstance。 http://www.ecma-international.org/ecma-262/7.0/#sec-instanceofoperatorによると、最初のものはNodeにエラーを投げてはいけません。 Chromeのようですね。 –

+0

しかし、 '@@ hasInstance'はプロトタイプチェーン内にあります。私は実際にそれを変更するのではなく、' obj'に別のプロパティ '@@ hasInstance'を作成しています。そして、 'new Function()'と 'function(){}'についても同じですが、なぜ彼らの振る舞いが異なっていますか? – MindlessRanger

+0

プロパティが書き込み可能でない場合は、チェーンの上位にプロパティを割り当てることはできません。例: 'var a = Object.create(null、{テスト:{値:42}}); var b = Object.create(a); '。 'b.test = 21;'は静かに失敗します。 –

答えて

1

[Symbol.hasInstance]プロパティは設定書き込み可能ではないではありません。

enter image description here

spec言う:

このプロパティがそれを可能性が改ざんを防止するために、非書き込みおよび非設定可能ですbound functionのターゲット機能をグローバルに公開するために使用することができます。そのため

、割り当て

obj[Symbol.hasInstance] =() => console.log('89'); 

は黙って失敗します。 プロトタイプでプロパティが定義されているかどうかは関係ありません。書き込み可能でない場合は、「子孫」によって上書きすることはできません。

したがって、Chromeの動作は正しいです。ノードについては


、それが存在する場合、すなわち、それは[Symbol.hasInstance]を使用していない、まだinstanceofの新しい動作を実装していないようです。その場合、右のオペランドは関数でなければなりません。これは最初の例では当てはまりません。

関連する問題