62

假设我们有以下代码:

[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.
    }
}

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

到目前为止,我一直在玩一些配置,但我还没有完全理解。

您能帮我了解如何在这三个地方访问此方法吗?

谢谢。

4

3 回答 3

65

下面有一些代码,但有一些重要的概念需要牢记。

任何实例上都不存在静态方法。这有充分的理由:

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

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

Test.aStaticFunction();

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

要明白我的意思,想想这个问题。

如果我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());
    }
}
于 2013-09-01T06:45:05.777 回答
4

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.
    }
}

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

于 2013-09-01T03:02:49.797 回答
-21

不要使用像 Class.staticMethod() 这样的类名,使用这个:

this.constructor.staticMethod()

维护静态方法的继承

编辑:如评论中所述,打字稿不支持this.constructor. 它的问题跟踪器中有一张公开票,但在过去 5 年中没有太大进展。

于 2016-05-09T11:13:43.250 回答