考虑以下两个片段:
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上没有任何解释这一点。
答案 0 :(得分:1)
函数的[Symbol.hasInstance]
属性不可写且不可配置:
spec说:
此属性不可写且不可配置,以防止可用于全局公开bound function的目标函数的篡改。
因此,分配
obj[Symbol.hasInstance] = () => console.log('89');
默默地失败了。在原型上定义属性并不重要,如果它不可写,它也不能被“后代”覆盖。
因此Chrome行为正确无误。
对于Node,它似乎尚未实现instanceof
的新行为,即如果它存在则不使用[Symbol.hasInstance]
。在这种情况下,右操作数必须是一个函数,而在第一个例子中则不是这样。