TypeScript:访问类中的静态方法(相同或其他方法)

dio*_*ney 48 javascript static-methods typescript

假设我们有以下代码:

[Test.js file]:
class Test {
    ...
    public static aStaticFunction():void {
          ...

           this.aMemberFunction(); // <- Issue #1.
    }

    private aMemberFunction():void {
          ...

          this.aStaticFunction(); // <- Issue #2.
    }
}

[Another.js file]:
class Another {
    ...

    private anotherMemberFunction():void {
          Test.aStaticFunction(); // <- Issue #3.
    }
}
Run Code Online (Sandbox Code Playgroud)

请参阅Issue #x.我想解决的问题的评论(3).

我现在一直在玩一些配置,但我还没有完成.

你能帮我理解如何在三个地方访问这些方法吗?

谢谢.

Fen*_*ton 48

下面有一些代码,但要记住一些重要的概念.

任何实例上都不存在静态方法.这有很好的理由:

  1. 可以在创建new实例之前调用它
  2. 它可以从实例外部调用,因此您不知道调用与哪个实例相关

因此,在调用静态方法的所有情况下,都需要使用全名:

Test.aStaticFunction();
Run Code Online (Sandbox Code Playgroud)

如果静态方法需要调用实例方法,则需要将其传入.但这确实为我敲响了警钟.如果静态方法依赖于实例方法,则它可能不应该是静态方法.

要明白我的意思,请考虑一下这个问题.

如果我Test.aStaticFunction()从实例外部调用,当创建了100个实例时,静态函数应该使用哪个实例?没有办法说出来.如果您的方法需要知道实例中的数据或调用实例上的方法,那么它几乎肯定不应该是静态的.

因此,尽管下面的代码有效,但它可能并不是您所需要的 - 您可能需要删除static关键字并确保在其他类中调用实例.

interface IHasMemberFunction {
    aMemberFunction(): void;
}

class Test {
    public static aStaticFunction(aClass: IHasMemberFunction):void {
           aClass.aMemberFunction();
    }

    private aMemberFunction():void {
          Test.aStaticFunction(this);
    }
}

class Another {
    private anotherMemberFunction():void {
          Test.aStaticFunction(new Test());
    }
}
Run Code Online (Sandbox Code Playgroud)


bas*_*rat 5

this与实例相关,而static成员独立于任何实例。因此,如果您想访问静态成员中实例的成员,则必须将其传入。但是在这种情况下,我首先看不出有静态成员的原因。我相信你需要两个功能。一种是静态的,一种是非静态的。这做了两件不同的事情,所以:

class Test {

    public  notaStaticFunction():void {
           this.aMemberFunction(); // <- Issue #1.
    }

    public static aStaticFunction():void {

    }

    private aMemberFunction():void {
          this.notaStaticFunction(); // <- Issue #2.
    }
}

class Another {
    private anotherMemberFunction():void {
          Test.aStaticFunction(); // <- Issue #3.
    }
}
Run Code Online (Sandbox Code Playgroud)

也就是说,您可以使用静态属性在静态函数和成员函数之间共享属性。

  • 如果静态函数需要引用同一父类中的另一个静态函数怎么办? (3认同)
  • @diosney - 一旦静态函数依赖于实例函数,它就不再是静态的。静态函数可以在创建任何实例之前调用。 (2认同)