ES6中从静态方法调用私有方法

4
我无法在静态方法中调用类的私有或非静态方法,以下是示例:

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

a.staticfun();

我试图仅公开调用所有私有方法的staticfun方法,但是这给我带来了this.fun1不是函数的问题。我尝试了许多使用“this”找到它的方法,但它并没有起作用。

如何在静态方法中调用私有实例方法?


JavaScript 中没有“私有”方法。你是指实例方法吗? - Bergi
在你的例子中不太清楚,但是你不能只是把 fun1 设为静态的吗? - Bergi
我正在创建一个Node.js微服务,其中我从module.exports返回promise {return new promise { promise.all().then(r=>fun2).then(r=> fun2)....最后我resolve()}}。我想把所有的promise和函数都包装在类中,并且函数不应该在类外部暴露,就像modules.exports = {class a{static promise(){.....} fun1(){} fun2(){}} return a.promise()}一样。 - Tapan Dave
1
a) 避免使用Promise构造函数反模式 b) 如果您不需要多个实例,那么没有理由将任何内容包装在class语法中。请参考:https://dev59.com/7F0a5IYBdhLWcg3w07rt - Bergi
3个回答

5
另一种方法是直接从类原型(字面意思上的prototype属性,而非__proto__)调用函数,如果你想避免实例化它。
class a {
 fun1(){
  console.log('fun1');
 }
 static staticfun(){
  console.log('staticfun');
  this.prototype.fun1();
 }
}

a.staticfun();

4

fun1不是一个静态函数,因此您需要定义一个新的a类实例才能调用它:

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

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

a.staticfun();

你应该注意,这不是一个好的实践方法。你不应该有一个依赖于非静态逻辑的静态方法。
一种解决方法是将a的实例传递给静态函数,但这完全违背了首先拥有静态方法的初衷。

为什么这不是理想的? - Blue
扩展以添加细节。 - Rory McCrossan

1

首先,阅读此SO问题

可以创建类a的实例,然后从实例中调用方法fun1

尽管如此,从静态方法调用非静态方法没有意义。

静态意味着该方法属于对象(而不是实例)。

class a {
 fun1(){
  console.log('fun1');
 }
 static staticfun(){
  console.log('staticfun');
  const classInstance = new a()
  classInstance.fun1();
 }
}

a.staticfun();


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接