【发布时间】:2017-08-19 14:28:10
【问题描述】:
在这个 sn-p 中,语句 f instanceof PipeWritable 返回 true (Node v8.4.0):
const stream = require('stream');
const fs = require('fs');
class PipeWritable extends stream.Writable {
constructor () {
super();
}
}
const s = new PipeWritable();
const f = fs.createWriteStream('/tmp/test');
console.log(f instanceof PipeWritable); // true ... ???
对象s:
-
Object.getPrototypeOf(s)是PipeWritable {} -
s.constructor是[Function: PipeWritable] -
PipeWritable.prototype是PipeWritable {}
对象f:
-
Object.getPrototypeOf(f)是WriteStream { ... } -
f.constructor是[Function: WriteStream] ... -
stream.WriteStream.prototype是Writable { ... }
原型链:
Object f Object s
--------------------- --------------------
Writable PipeWritable
Stream Writable
EventEmitter Stream
Object EventEmitter
Object
instanceof 运算符测试其原型链中的对象是否具有构造函数的原型属性。
我希望(f instanceof PipeWritable) === false,因为PipeWritable 不在f 的原型链中(上面的链通过Object.getPrototypeOf(...) 的调用验证)。
但它返回true,因此我的分析有问题。
正确答案是什么?
【问题讨论】:
-
这真是太奇怪了。
-
其他类也会出现这种情况吗?也许只是 Streams 或 Nodejs 错误的一些奇怪之处?
-
FWIW,我可以在 Node v8.2.1 上验证您的结果。 “我希望
(f instanceof PipeWritable) === false,因为构造函数PipeWritable不在f的原型链中。” 这不是 函数链,它是PipeWritable.prototype指向的对象。但这也不在链中。 (我检查了。) -
扩展
stream.Readable不会产生同样的错误,顺便说一句 -
看起来可能与此有关:github.com/nodejs/node/pull/8834(节点 6.7.0 返回
false,节点 6.8.0 返回true)
标签: javascript node.js ecmascript-6