Javascript 扩展类方法不公开
我试图用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
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上创建一个问题。