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

时间:2013-09-01 02:35:43

标签: javascript typescript static-methods

假设我们有以下代码:

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

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

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

您能否帮我理解如何在三个地方访问此方法?

感谢。

3 个答案:

答案 0 :(得分:42)

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

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

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

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

    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());
        }
    }
    

答案 1 :(得分:3)

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

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

答案 2 :(得分:-20)

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

this.constructor.staticMethod()

维护静态方法的继承