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 的静态成员变量相关推荐

  1. 为什么静态方法无法直接调用非静态成员变量和方法

    静态方法无法直接调用非静态成员变量和方法 看到这句话,要想到形容的是这样的如下 静态方法里面无法调用非静态变量 下面在写一个对比非静态的方法和静态方法调用变量对比 问题原因 静态变量和静态的方法是属于 ...

  2. C++ 笔记(18)— 类和对象(this 指针、指向类的指针、类静态成员变量和函数)

    1. this 指针 在 C++ 中,每一个对象都能通过 this 指针来访问自己的地址. this 指针是所有成员函数的隐含参数.因此,在成员函数内部,它可以用来指向调用对象. 友元函数没有 thi ...

  3. 类的静态成员变量和静态成员函数的使用方法三

    第五个例子,使用类的静态成员变量 源码打印? #include <stdio.h> class Point { public: Point() { m_nPointCount++; } ~ ...

  4. 静态成员变量不占用类的内存空间

    假定程序运行环境为:操作系统Windows 2000,VC6.0编译环境,X86(80586)CPU处理器(32位小字节序处理器,4字节对齐) class CExample { public:     ...

  5. C++中类的静态成员变量和静态成员函数

    静态成员变量: 在类里用static对变量定义,缺省时初始化为0,不能在类中初始化,因为static变量在类实例化之前就已经存在. 在类外用<数据类型><类名>::<静态 ...

  6. 类中静态成员变量 无法解析的外部符号

    [1]如下代码及编译错误 如标题,不做赘述. [2]原因及解决方案 原因:之所以报如上编译错误,因为静态成员变量未初始化. 解决方案:类中静态成员需要在类外进行初始化.其格式为:类型 类名::静态成员 ...

  7. 静态成员变量和非静态成员变量的5个主要区别

    1.从保存位置: a) 静态成员变量: 方法区的静态区域 b) 非静态成员变量: 堆内存中的对象空间里面 2.从书写格式上看: a) 静态成员变量: 在数据类型前面多了一个static修饰 b) 非静 ...

  8. C++中的静态成员变量

    文章目录 1 C++中的静态成员变量 1.1 C++中静态成员变量的使用方法 1 C++中的静态成员变量 1.1 C++中静态成员变量的使用方法 在C++中可以定义静态成员变量: 静态成员变量属于整个 ...

  9. C++ static静态成员变量详解

    对象的内存中包含了成员变量,不同的对象占用不同的内存(已在<C++对象的内存模型>中提到),这使得不同对象的成员变量相互独立,它们的值不受其他对象的影响.例如有两个相同类型的对象 a.b, ...

最新文章

  1. PowerShell入门
  2. K8s 资源全汇总 | K8s 大咖带你 31 堂课从零入门 K8s
  3. 在Flutter中更快地加载您的图像资源
  4. oracle别名用双引号,Oracle别名大小写 -----解决方案
  5. [css] css的属性content有什么作用呢?有哪些场景可以用到?
  6. 自动化测试工具selenium python_Selenium自动化测试工具使用方法汇总
  7. Java各进制之间的转换
  8. 用php打出2020年是庚子鼠年,2020年庚子鼠年,做到三善,命运必变!
  9. 提高linux运行速度,提高Linux操作系统的运行速度
  10. CSDN 2020博客之星投票进行中:送你喜爱的博主C位出道!
  11. postgresql 集合类型_PostgreSQL数据类型-时间数据类型
  12. Flex4的皮肤skin
  13. 190414每日一句
  14. ​(Resistance Temperature Detector) 电阻温度探测器​
  15. linux ora -03113,ORA-03113:通信通道的文件结尾
  16. 【GA MTSP】基于matlab遗传算法求解多旅行商问题(同起点不同终点)【含Matlab源码 1325期】
  17. 市场竞争力法则:以小博大,虽败犹荣
  18. 仿ios相机apk_icamera仿苹果安卓版-icamera仿苹果软件下载-多多root网
  19. java群侠传_梦幻群侠传之天剑如虹(下)
  20. 关于Linux的视频编程(v4l2编程)

热门文章

  1. Log4cpp介绍及使用
  2. 基于pip的安装lxml库报错解决方案
  3. 对java:comp/env的研究
  4. 流量控制与拥塞控制区别
  5. 汇编语言的准备知识--给初次接触汇编者 之三
  6. 开始学习VS2008+.net3.5咯 :)
  7. 方立勋_30天掌握JavaWeb_div和css基础
  8. 20190403vim编辑器week1_day3
  9. python的内存分配
  10. 18寒假最后一测+dijistra模板