考虑以下两个片段:
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,第二个不记录任何内容。
在节点v6.3.1中,第一个结果为
TypeError: Expecting a function in instanceof check, but got #<Object>
,而第二个则不记录任何内容。这是一个错误吗?预期的行为是什么?在MDN上,没有任何解释。
最佳答案
函数的[Symbol.hasInstance]
属性不可写且不可配置:
spec说:
此属性是不可写和不可配置的,以防止可能被用来全局公开bound function的目标函数的篡改。
因此,作业
obj[Symbol.hasInstance] = () => console.log('89');
默默地失败。将该属性定义在原型上无关紧要,如果该属性不可写,也不能被“后代”覆盖。
因此,Chrome行为正确。
至于Node,似乎它尚未实现
instanceof
的新行为,即它不使用[Symbol.hasInstance]
(如果存在)。在这种情况下,右操作数必须是一个函数,在第一个示例中不是这种情况。关于javascript - 众所周知的符号不适用于功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39018929/