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
下面有一些代码,但要记住一些重要的概念.
任何实例上都不存在静态方法.这有很好的理由:
new
实例之前调用它因此,在调用静态方法的所有情况下,都需要使用全名:
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)
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)
也就是说,您可以使用静态属性在静态函数和成员函数之间共享属性。