Javascript 扩展类方法不公开

Javascript 扩展类方法不公开,javascript,node.js,class,ecmascript-6,Javascript,Node.js,Class,Ecmascript 6,我试图用javascript扩展一个类,并向该类添加一些额外的函数 const Pino = require('pino'); class Logger extends Pino { constructor(options = { name: 'isWorking' }) { super(options); this.check = "1234"; this.ppp = () => {} } rrr() {} } let pp = new Logg

我试图用javascript扩展一个类,并向该类添加一些额外的函数

const Pino = require('pino');

class Logger extends Pino {
  constructor(options = { name: 'isWorking' }) {
    super(options);
    this.check = "1234";
    this.ppp = () => {}
  }

  rrr() {}
}

let pp = new Logger();
console.log(pp.check)
console.log(pp.ppp)
console.log(pp.rrr)
console.log(pp instanceof Logger)
console.log(pp instanceof Pino)
这是输出

1234
[Function]
undefined
false
false
为什么
rrr
功能没有公开?我想重写基类。这应该适用于普通类,这个
Pino
类有什么特别之处

注意:这里的pino基类是javascript模块


谢谢,

原因是
Pino
的定义(
Pino
在模块中)不返回
Pino
的实例,而是一个合成对象——它在末尾有一个
返回实例
语句

尽管返回的对象已收到特定的原型,但它不是
pino.prototype

因此,当创建
Logger
的实例时,它也会返回这个“外来”对象,而
rrr
在未使用的
Logger.prototype
上保持“孤立”状态

请参阅此简化演示:

函数Pino(){返回新日期();}
类记录器扩展了Pino{
rrr(){return 1;}
}
常数a=新的皮诺;
常数b=新的记录器;
console.log(一个Pino实例);//假的
console.log(记录器的b实例);//假的
console.log(b Pino实例);//假的
console.log(b instanceof Date);//真的

console.log(b.rrr类型);//未定义
注意:我是Pino的维护者

require('pino')
返回的函数不是“构造函数”函数。因此,
class
sugar语法不适用于定制Pino原型:我们不公开原型

要定制Pino,您可以使用自己的功能包装一个实例:

const instance = require('pino')()
Object.defineProperties(instance, {
  rrr: {
    value: function () {
      this.info('this is the rrr function')
    }
  }
})

instance.rrr()

我强烈建议学习Javascript中对象的实际工作方式,而不是依赖(在我看来是灾难性的)
语法。这是一套关于这个主题的优秀文章。这本书是一本关于这个主题的非常深入的书。

无法复制。如果您希望Pino能够被调试,请发布其代码。请发布
Pino
的代码。可能它返回的是普通对象,而不是正确的实例?您可以检查记录器的
pp instanceof
(可能
false
)是否为
pp instanceof Pino
@Sathish Satire。这毫无意义。@Bergi Hi trincot,你能解释一下吗,或者给我指一下alink什么的。如果可能的话,我可以知道以任何其他方式扩展该模块吗?即使它是
pino.prototype
(这将有助于
instanceof pino
),也不允许扩展“类”。@Sathish我建议打开一个Github问题,并请求一个功能,以使库可扩展。作者会告诉你如何最好地完成它,告诉你不要做,而是使用一种不同的定制机制,或者可能会发布一个允许子类化的库的新版本。我添加了一些片段。Trincot感谢提供了详细的示例。请你也投票表决这个问题好吗。我将确保基于此讨论在github上创建一个问题。