考虑以下两个片段:

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]属性不可写且不可配置:

javascript - 众所周知的符号不适用于功能-LMLPHP

spec说:


  此属性是不可写和不可配置的,以防止可能被用来全局公开bound function的目标函数的篡改。


因此,作业

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


默默地失败。将该属性定义在原型上无关紧要,如果该属性不可写,也不能被“后代”覆盖。

因此,Chrome行为正确。



至于Node,似乎它尚未实现instanceof的新行为,即它不使用[Symbol.hasInstance](如果存在)。在这种情况下,右操作数必须是一个函数,在第一个示例中不是这种情况。

关于javascript - 众所周知的符号不适用于功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39018929/

10-11 02:10