Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Invoking private method from static method ES6

I am unable to call private or non static method from static method in class, below is the example

class a {
 fun1(){
  console.log('fun1');
 }
 static staticfun(){
  console.log('staticfun');
  this.fun1();
 }
}

a.staticfun();

I am trying to expose only staticfun method which internally calls all private methods, but this gives me this.fun1 is not a function. I tried to find many ways to find it with 'this', but it does work.

How do I call private instance methods inside static methods?

like image 481
Tapan Dave Avatar asked Jan 02 '23 16:01

Tapan Dave


2 Answers

fun1 is not a static function, so you need to define a new instance of the a class in order to call it:

class a {
  fun1() {
    console.log('fun1');
  }

  static staticfun() {
    console.log('staticfun');
    
    new this().fun1();
  }
}

a.staticfun();

You should note that this is not good practice, though. You shouldn't have a static method relying on non-static logic.

A workaround would be to pass an instance of a to the static function, but that completely defies the point of having a static method in the first place.

like image 83
Rory McCrossan Avatar answered Jan 04 '23 05:01

Rory McCrossan


Another way is to call the function directly from the class prototype (meaning literally the prototype property, not __proto__), if you want to avoid instantiating it.

class a {
 fun1(){
  console.log('fun1');
 }
 static staticfun(){
  console.log('staticfun');
  this.prototype.fun1();
 }
}

a.staticfun();
like image 45
Szab Avatar answered Jan 04 '23 06:01

Szab