は、次の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にはこれを説明するものは何もない。機能の
仕様は、「このプロパティは書き込み不可能であり、バインドされた関数のターゲット関数をグローバルに公開するために使用される改ざんを防ぐために構成できません」* *しかし、「コンストラクタ関数は、オブジェクトは、関数上で異なる@@ 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のようですね。 –
しかし、 '@@ hasInstance'はプロトタイプチェーン内にあります。私は実際にそれを変更するのではなく、' obj'に別のプロパティ '@@ hasInstance'を作成しています。そして、 'new Function()'と 'function(){}'についても同じですが、なぜ彼らの振る舞いが異なっていますか? – MindlessRanger
プロパティが書き込み可能でない場合は、チェーンの上位にプロパティを割り当てることはできません。例: 'var a = Object.create(null、{テスト:{値:42}}); var b = Object.create(a); '。 'b.test = 21;'は静かに失敗します。 –