Причина в том, что определение Pino
(pino
в модуле) возвращает не экземпляр pino
, а синтезированный объект - в конце он имеет оператор return instance
.
Хотя этот возвращенный объект получил конкретный прототип, он не является pino.prototype
.
Таким образом, когда создается экземпляр Logger
, он также возвращает этот «чужой» объект, в то время как rrr
остается «осиротевшим» на неиспользованном Logger.prototype
.
См. Это упрощенное демо:
function Pino() { return new Date(); }
class Logger extends Pino {
rrr() { return 1; }
}
const a = new Pino;
const b = new Logger;
console.log(a instanceof Pino); // false
console.log(b instanceof Logger); // false
console.log(b instanceof Pino); // false
console.log(b instanceof Date); // true
console.log(typeof b.rrr); // undefined
Если pino
просто вернет правильный экземпляр (this
), тогда будет доступно rrr
:
function Pino() { } // returns `this`
class Logger extends Pino {
rrr() { return 1; }
}
const a = new Pino;
const b = new Logger;
console.log(a instanceof Pino); // true
console.log(b instanceof Logger); // true
console.log(b instanceof Pino); // true
console.log(b instanceof Date); // false (obviously)
console.log(typeof b.rrr); // function
Уродливая работа вокруг
Если вам действительно нужно расширение, то это можно сделать следующим образом, но лучше попросить автора библиотеки сделать их классы расширяемыми:
function Pino() { return new Date(); }
function PinoClass() {} // Don't define anything in this class
PinoClass.prototype = Object.getPrototypeOf(new Pino);
class Logger extends PinoClass {
rrr() { return 1; }
}
const a = new Pino;
const b = new Logger;
console.log(a instanceof Pino); // false
console.log(b instanceof Logger); // true
console.log(b instanceof Pino); // false
console.log(b instanceof Date); // true
console.log(typeof b.rrr); // function