当我在Node 4中执行此命令时,最后一个语句的结果为
true
,而在Node 6中则为false
。为什么?F = () => {};
F.prototype = {};
Object.create(F.prototype) instanceof F;
true
,而在Node 6中则为false
。为什么?F = () => {};
F.prototype = {};
Object.create(F.prototype) instanceof F;
这很可能是Node 6.x中的一个bug。请考虑以下内容:
const Foo = () => {};
Foo.prototype = {};
const foo = Object.create(Foo.prototype);
// false in Node 6, true in Chrome
console.log(foo instanceof Foo);
// true in Node 6, true in Chrome
console.log(Foo[Symbol.hasInstance](foo));
前两个日志应该返回相同的值,因为instanceof运算符被定义为调用并返回Foo的@@hasInstance方法(如果存在) (§12.9.4
)。更有趣的是,在以下情况下,node会抛出TypeError,而期望的是false,因为Foo不可调用 (§7.3.19
):
const Foo = {
"prototype": {},
[Symbol.hasInstance]: Function.prototype[Symbol.hasInstance]
};
const foo = Object.create(Foo.prototype);
// throws in Node 6, false in Chrome
console.log(foo instanceof Foo);
// false in Node 6, false in Chrome
console.log(Foo[Symbol.hasInstance](foo));
PS
测试使用的是Node v6.2.2 (64位)在Windows系统上进行的。
instanceof
,但有时候会用到... 我希望我编写的一个混入模块 deco 的下一个版本能够继续支持这种使用instanceof
的方式。 - wprl