【发布时间】:2026-01-01 19:20:03
【问题描述】:
试图让静态函数访问属性 xdate,该属性在构造函数中初始化(在 typescript 1.5.3 中)。
this.xdate 可以在所有其他实例方法中访问。 它在静态方法中仍然无法访问。
问。无论如何我可以在静态方法中使 this.xdate 可访问吗?
下面是我的代码:-
class vehicle{
constructor(private xdate = new Date()){}
vroom(){ console.log(this.xdate); }
static staticvroom(){ console.log(this.xdate);} //Warning: Property 'xdate' does not exist on type 'typeof vehicle'.
}//vehicle ends
let v1 = new vehicle;
v1.vroom(); //works
vehicle.staticvroom(); //undefined
/* this is how i executed it:-
D:\js\Ang2\proj2\myforms\tsc_cRAP>tsc 7_.ts
7_.ts(18,42): error TS2339: Property 'xdate' does not exist on type 'typeof vehicle'.
D:\js\Ang2\proj2\myforms\tsc_cRAP>node 7_.js
2017-06-23T09:17:41.365Z
undefined
*/
任何指针都会有很大帮助。 (如果这是一个重复的问题,请提前道歉)
/* UglyHack#1:因为静态方法甚至在对象实例之前可用,所以我创建了一个 tmp obj。在 staticvroom(){} 中,它起作用了。
static staticvroom(){
console.log((new vehicle).xdate);
}
不确定这方面的性能问题。
*/
【问题讨论】:
-
你不能。由于静态成员内部的
this指的是类本身而不是类实例。 -
我可以创建一个新的 obj。在静态方法中,然后使用 obj 变量访问它。这对我有用:`static staticvroom(){ let x = new vehicle;控制台.log(x.xdate); } `
-
这是一个糟糕的设计,而且它非常容易出错。
-
你能解释一下为什么它很可怕吗?我可以将对象设置为 null 并在 staticvroom() 中删除对它的所有引用。静态方法甚至在创建实例之前就可以访问;只是可能会使用该功能,我想。虽然我知道它很丑,但我没有看到任何性能问题。
-
静态方法无法通过设计访问该类实例的任何非静态部分。似乎您不应该将该方法静态或不将
xdate作为非静态字段。但是,除非您根据自己的主要意图改进您的问题,否则我们无法确定这一点。
标签: typescript constructor this static-methods