Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript中的重写类变量_Javascript_Node.js - Fatal编程技术网

Javascript中的重写类变量

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

我做了一个班级服务。我正在尝试每X秒运行一次间隔。默认值为30秒。但是如果在其他类中需要,我想设置一个自定义延迟。我找不到重写父类中变量的方法

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
完成之前,子类根本无法与实例交互。