Javascript 众所周知的符号不适用于函数

Javascript 众所周知的符号不适用于函数,javascript,google-chrome,reflection,ecmascript-6,symbols,Javascript,Google Chrome,Reflection,Ecmascript 6,Symbols,考虑以下两个片段: obj = {}; // can be [], Number(), eg. but not Function() obj[Symbol.hasInstance] = () => console.log('89'); ({}) instanceof obj; 及 两者都应记录“89”,但仅在第一个代码段中记录“89” 在Chrome52中,第一个记录89,第二个不记录任何内容 在节点v6.3.1中,第一个结果是TypeError:在instanceof check中需要

考虑以下两个片段:

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

两者都应记录“89”,但仅在第一个代码段中记录“89”

在Chrome52中,第一个记录89,第二个不记录任何内容

在节点v6.3.1中,第一个结果是
TypeError:在instanceof check中需要一个函数,但得到了#
,而第二个则不记录任何内容


这是虫子吗?预期的行为是什么?在MDN上没有任何解释。

函数的
[Symbol.hasInstance]
属性不可写且不可配置:

报告说:

此属性不可写且不可配置,以防止可用于全局公开的目标函数的篡改

因此,任务

obj[Symbol.hasInstance] = () => console.log('89');
默默地失败。在原型上定义属性并不重要,如果属性不可写,那么“后代”也不能覆盖它

所以Chrome的行为是正确的



至于Node,它似乎还没有实现
instanceof
的新行为,也就是说,如果存在
[Symbol.hasInstance]
。在这种情况下,正确的操作数必须是一个函数,这在第一个示例中不是这样。

规范说“此属性不可写且不可配置,以防止篡改,可用于全局公开绑定函数的目标函数。”但它也说“构造函数可以控制哪些对象被
instanceof
识别为其实例,方法是在该函数上公开另一个@hasInstance方法。”。" . 根据,第一个不应该在节点中抛出错误。Chrome似乎是正确的。但是,
@@hasInstance
在原型链中,我实际上并没有修改它,只是在
对象上创建了另一个属性
@@hasInstance
new Function()
Function(){}
也是如此,为什么它们的行为不同?如果属性不可写,则不能在链的更高层为其赋值。示例:
var a=Object.create(null,{test:{value:42});var b=对象。创建(a)<代码>b.测试=21静默失败。
obj[Symbol.hasInstance] = () => console.log('89');