В этом фрагменте оператор 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.prototypePipeWritable {}
Объект f:
-
Object.getPrototypeOf(f)WriteStream { ... } -
f.constructor[Function: WriteStream] ... -
stream.WriteStream.prototypeWritable { ... }
Цепочки прототипов:
Object f Object s
--------------------- --------------------
Writable PipeWritable
Stream Writable
EventEmitter Stream
Object EventEmitter
Object
Следуя определению instanceof:
Оператор instanceof проверяет, имеет ли объект в своей цепочке прототипов свойство прототипа конструктора.
Я ожидал бы, что (f instanceof PipeWritable) === false, потому что PipeWritable не находится в цепочке прототипов f (цепочка выше проверена вызовами Object.getPrototypeOf(...)).
Но он возвращает true, поэтому в моем анализе что-то не так.
Какой правильный ответ?