TypeScript class 的静态成员变量
Static Members
类可能有静态成员。 这些成员与类的特定实例无关。 它们可以通过类构造函数对象本身访问:
class MyClass {static x = 0;static printX() {console.log(MyClass.x);}
}
console.log(MyClass.x);
MyClass.printX();
Special Static Names
有一些特殊的名称,不能用于 TypeScript class 的静态成员变量定义。
从 Function 原型中覆盖属性通常是不安全/不可能的。 因为类本身就是可以用 new 调用的函数,所以不能使用某些静态名称。 名称、长度和调用等函数属性不能定义为静态成员:
class S {static name = "S!";
Static property 'name' conflicts with built-in property 'Function.name' of constructor function 'S'.
}
Generic Classes
类,很像接口,可以是通用的。 当使用 new 实例化泛型类时,其类型参数的推断方式与函数调用中的推断方式相同:
class Box<Type> {contents: Type;constructor(value: Type) {this.contents = value;}
}const b = new Box("hello!");const b: Box<string>
Type Parameters in Static Members
下列代码会出现语法错误:
class Box<Type> {static defaultValue: Type;
Static members cannot reference class type parameters.
}
请记住,类型总是被完全擦除! 在运行时,只有一个 Box.defaultValue 属性槽。 这意味着设置 Box.defaultValue (如果可能的话)也会改变 Box.defaultValue - 不好。 泛型类的静态成员永远不能引用类的类型参数。
this at Runtime in Classes
重要的是要记住 TypeScript 不会改变 JavaScript 的运行时行为,而且 JavaScript 以具有一些特殊的运行时行为而闻名。
JavaScript 对此的处理确实不同寻常:
class MyClass {name = "MyClass";getName() {return this.name;}
}
const c = new MyClass();
const obj = {name: "obj",getName: c.getName,
};// Prints "obj", not "MyClass"
console.log(obj.getName());
长话短说,默认情况下,函数内 this 的值取决于函数的调用方式。 在这个例子中,因为函数是通过 obj 引用调用的,所以它的 this 值是 obj 而不是类实例。
这很少是你想要发生的! TypeScript 提供了一些方法来减轻或防止这种错误。
方法1 - 使用箭头函数
如果您有一个经常以丢失 this 上下文的方式调用的函数,则使用箭头函数属性而不是方法定义是有意义的:
class MyClass {name = "MyClass";getName = () => {return this.name;};
}
const c = new MyClass();
const g = c.getName;
// Prints "MyClass" instead of crashing
console.log(g());
这有一些权衡:
- 即使对于未使用 TypeScript 检查的代码,此值也保证在运行时是正确的
- 这将使用更多内存,因为每个类实例都有自己的以这种方式定义的每个函数的副本
- 不能在派生类中使用 super.getName,因为原型链中没有条目可以从中获取基类方法
TypeScript class 的静态成员变量相关推荐
- 为什么静态方法无法直接调用非静态成员变量和方法
静态方法无法直接调用非静态成员变量和方法 看到这句话,要想到形容的是这样的如下 静态方法里面无法调用非静态变量 下面在写一个对比非静态的方法和静态方法调用变量对比 问题原因 静态变量和静态的方法是属于 ...
- C++ 笔记(18)— 类和对象(this 指针、指向类的指针、类静态成员变量和函数)
1. this 指针 在 C++ 中,每一个对象都能通过 this 指针来访问自己的地址. this 指针是所有成员函数的隐含参数.因此,在成员函数内部,它可以用来指向调用对象. 友元函数没有 thi ...
- 类的静态成员变量和静态成员函数的使用方法三
第五个例子,使用类的静态成员变量 源码打印? #include <stdio.h> class Point { public: Point() { m_nPointCount++; } ~ ...
- 静态成员变量不占用类的内存空间
假定程序运行环境为:操作系统Windows 2000,VC6.0编译环境,X86(80586)CPU处理器(32位小字节序处理器,4字节对齐) class CExample { public: ...
- C++中类的静态成员变量和静态成员函数
静态成员变量: 在类里用static对变量定义,缺省时初始化为0,不能在类中初始化,因为static变量在类实例化之前就已经存在. 在类外用<数据类型><类名>::<静态 ...
- 类中静态成员变量 无法解析的外部符号
[1]如下代码及编译错误 如标题,不做赘述. [2]原因及解决方案 原因:之所以报如上编译错误,因为静态成员变量未初始化. 解决方案:类中静态成员需要在类外进行初始化.其格式为:类型 类名::静态成员 ...
- 静态成员变量和非静态成员变量的5个主要区别
1.从保存位置: a) 静态成员变量: 方法区的静态区域 b) 非静态成员变量: 堆内存中的对象空间里面 2.从书写格式上看: a) 静态成员变量: 在数据类型前面多了一个static修饰 b) 非静 ...
- C++中的静态成员变量
文章目录 1 C++中的静态成员变量 1.1 C++中静态成员变量的使用方法 1 C++中的静态成员变量 1.1 C++中静态成员变量的使用方法 在C++中可以定义静态成员变量: 静态成员变量属于整个 ...
- C++ static静态成员变量详解
对象的内存中包含了成员变量,不同的对象占用不同的内存(已在<C++对象的内存模型>中提到),这使得不同对象的成员变量相互独立,它们的值不受其他对象的影响.例如有两个相同类型的对象 a.b, ...
最新文章
- PowerShell入门
- K8s 资源全汇总 | K8s 大咖带你 31 堂课从零入门 K8s
- 在Flutter中更快地加载您的图像资源
- oracle别名用双引号,Oracle别名大小写 -----解决方案
- [css] css的属性content有什么作用呢?有哪些场景可以用到?
- 自动化测试工具selenium python_Selenium自动化测试工具使用方法汇总
- Java各进制之间的转换
- 用php打出2020年是庚子鼠年,2020年庚子鼠年,做到三善,命运必变!
- 提高linux运行速度,提高Linux操作系统的运行速度
- CSDN 2020博客之星投票进行中:送你喜爱的博主C位出道!
- postgresql 集合类型_PostgreSQL数据类型-时间数据类型
- Flex4的皮肤skin
- 190414每日一句
- ​(Resistance Temperature Detector) 电阻温度探测器​
- linux ora -03113,ORA-03113:通信通道的文件结尾
- 【GA MTSP】基于matlab遗传算法求解多旅行商问题(同起点不同终点)【含Matlab源码 1325期】
- 市场竞争力法则:以小博大,虽败犹荣
- 仿ios相机apk_icamera仿苹果安卓版-icamera仿苹果软件下载-多多root网
- java群侠传_梦幻群侠传之天剑如虹(下)
- 关于Linux的视频编程(v4l2编程)