В этом фрагменте оператор 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:
Оператор instanceof проверяет, имеет ли объект в своей цепочке прототипов свойство прототипа конструктора.
Я ожидал бы, что (f instanceof PipeWritable) === false
, потому что PipeWritable
не находится в цепочке прототипов f
(цепочка выше проверена вызовами Object.getPrototypeOf(...)
).
Но он возвращает true
, поэтому в моем анализе что-то не так.
Какой правильный ответ?