Javascript中的重写类变量
我做了一个班级服务。我正在尝试每X秒运行一次间隔。默认值为30秒。但是如果在其他类中需要,我想设置一个自定义延迟。我找不到重写父类中变量的方法Javascript中的重写类变量,javascript,node.js,Javascript,Node.js,我做了一个班级服务。我正在尝试每X秒运行一次间隔。默认值为30秒。但是如果在其他类中需要,我想设置一个自定义延迟。我找不到重写父类中变量的方法 class Service { delay = 30; constructor(api, client = undefined) { this.api = api; this.client = client; this.handle(); } getMiliSe
class Service {
delay = 30;
constructor(api, client = undefined) {
this.api = api;
this.client = client;
this.handle();
}
getMiliSeconds() {
return this.delay * 1000;
}
service = async () => {
// Service to run in background
}
handle() {
setInterval(() => { this.service() }, this.getMiliSeconds());
}
}
module.exports = Service;
扩展类服务时,我试图覆盖delay
变量
class Notification extends Service {
delay = 60;
service = async () => {
// I am not running every 60 seconds.
}
}
module.exports.Notification = Notification;
但是,间隔函数仍然每30秒运行一次。而不是我在Notifications类中设置的60秒。问题是超级构造函数在子构造函数运行或分配给实例之前运行。例如:
class Parent {
prop = 'foo'
constructor() {
console.log(this.prop);
}
}
class Child extends Parent {
prop = 'bar'
}
将始终记录foo
,因为类字段prop='bar'
仅在父构造函数完成并将控制流返回给子构造函数后运行
在超级构造函数中调用this.handle
时,GetMilisonds
会立即运行,在子级有机会将自己的delay
分配给实例之前检索延迟
为了修复它,我将this.handle
移出构造函数,这样就可以在对象完全实例化之后而不是之前按需调用它
在下面的代码段中,子类中的delay=1
现在成功地使子服务每秒运行一次,而不是每3秒运行一次
类服务{
延迟=3;
构造函数(api,客户端=未定义){
this.api=api;
this.client=client;
}
GetMilisons(){
返回此值。延迟*1000;
}
服务=异步()=>{
log(“父服务”);
//要在后台运行的服务
}
句柄(){
setInterval(()=>{this.service()},this.getMilisonds());
}
}
类通知扩展了服务{
延迟=1;
服务=异步()=>{
console.log(“子服务”);
}
}
const n=新通知();
n、 句柄()代码>问题在于超级构造函数在子构造函数运行或分配给实例之前运行。例如:
class Parent {
prop = 'foo'
constructor() {
console.log(this.prop);
}
}
class Child extends Parent {
prop = 'bar'
}
将始终记录foo
,因为类字段prop='bar'
仅在父构造函数完成并将控制流返回给子构造函数后运行
在超级构造函数中调用this.handle
时,GetMilisonds
会立即运行,在子级有机会将自己的delay
分配给实例之前检索延迟
为了修复它,我将this.handle
移出构造函数,这样就可以在对象完全实例化之后而不是之前按需调用它
在下面的代码段中,子类中的delay=1
现在成功地使子服务每秒运行一次,而不是每3秒运行一次
类服务{
延迟=3;
构造函数(api,客户端=未定义){
this.api=api;
this.client=client;
}
GetMilisons(){
返回此值。延迟*1000;
}
服务=异步()=>{
log(“父服务”);
//要在后台运行的服务
}
句柄(){
setInterval(()=>{this.service()},this.getMilisonds());
}
}
类通知扩展了服务{
延迟=1;
服务=异步()=>{
console.log(“子服务”);
}
}
const n=新通知();
n、 句柄()代码>当然,在我的主文件中,我像这样实例化它们:让服务=[新通知(api,客户端),新接收者(api,客户端)]代码>当然,在我的主文件中,我像这样实例化它们:让服务=[新通知(api,客户端),新接收者(api,客户端)]代码>我没有意识到这一点,但这完全有道理。非常感谢。有没有可能重写构造函数并更改那里的延迟,然后调用super()方法来调用父构造函数?没有,我不这么认为,没有任何好的方式。在父类的super
完成之前,子类根本无法与实例交互。我没有意识到这一点,但这很有意义。非常感谢。有没有可能重写构造函数并更改那里的延迟,然后调用super()方法来调用父构造函数?没有,我不这么认为,没有任何好的方式。在父类的super
完成之前,子类根本无法与实例交互。