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

时间:2016-08-18 12:59:58

标签: javascript google-chrome reflection ecmascript-6 symbols

考虑以下两个片段:

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上没有任何解释这一点。

1 个答案:

答案 0 :(得分:1)

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

enter image description here

spec说:

  

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

因此,分配

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

默默地失败了。在原型上定义属性并不重要,如果它不可写,它也不能被“后代”覆盖。

因此Chrome行为正确无误。

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