1. class 类名 {
  2. /* 静态属性 */
  3. static 属性: 类型 = 属性值;
  4. /* 实例属性 */
  5. 属性: 类型 = 属性值;
  6. /* 只读属性 */
  7. readonly 属性: 类型 = 属性值;
  8. static readonly 属性: 类型 = 属性值;
  9. constructor(参数: 类型) {
  10. this.属性 = 参数;
  11. }
  12. /* 静态方法 */
  13. static 方法名() {}
  14. /* 实例方法 */
  15. 方法名() {}
  16. }

constructor 就是构造器,用来给实例属性赋值,在实例化对象时会被调用
构造器中的 this 指向实例化对象
类名首字母必须大写

静态属性不需要实例化对象,使用类名直接使用
实例属性需要实例化对象进行调用
只读属性只能调用,不能修改

方法中的 this 指向调用的对象

继承

  1. class Father {
  2. name: string;
  3. age: number;
  4. constructor(name: string, age: number) {
  5. this.name = name;
  6. this.age = age;
  7. }
  8. run() {
  9. console.log(' running');
  10. }
  11. }
  12. class Son extends Father {
  13. weight: number;
  14. constructor(name: string, age: number, weight: number) {
  15. super(name, age);
  16. this.weight = weight;
  17. }
  18. run() {
  19. console.log(this.name + 'running');
  20. }
  21. say() {
  22. console.log('borning');
  23. }
  24. }
  25. let son = new Son('son', 18, 70);
  26. son.run();
  27. son.say();

子类继承父类,使用 extends 关键字
子类继承父类以后,可以使用父类的属性和方法
子类可以重写父类的方法(重写即方法名相同,方法体不同)
子类重写父类方法,并不会影响父类中的方法

子类自定义的属性和方法是不能被父类调用的

子类中的 super 表示父类
super() 表示父类的构造器,需要写在子类构造器的第一行

抽象类

抽象类不能用来创建对象,专门用来继承的

  1. abstract class Father {
  2. abstract run(): void;
  3. }

以 abstract 开头的类就是抽象类
抽象类中可以定义抽象方法

抽象方法以 abstract 开头,并且没有方法体
抽象方法只能定义在抽象类中,继承的子类必须重写抽象方法

接口

接口就是用来定义类的结构

  1. interface myInterface {
  2. name: string;
  3. age: number;
  4. run(): void;
  5. }
  6. class myClass implements myInterface {
  7. constructor(name: string, age: number) {
  8. this.name = name;
  9. this.age = age;
  10. }
  11. run(): void{
  12. console.log('running')
  13. }
  14. }
  15. let human = new myClass('张三', 30);
  16. human.run();

接口中的所有属性都没有实际的值,需要类实现来赋值
接口中的所有方法都没有方法体,需要类实现来重写c

类需要使用 implements 来实现接口

  1. interface myInterface {
  2. name: string;
  3. age: number;
  4. }
  5. let obj: myInterface;

接口也可以当作类型声明来使用

属性封装

提高数据的安全性

变量修饰符

  • public:公共的,可以任意修改,默认值
  • private:私有的,只能在类内部进行修改
  • protected:受保护的,只能在当前类或当前类子类访问

封装

  1. class myClass {
  2. _name: string;
  3. _age: number;
  4. setName(value: string) {
  5. this._name = value;
  6. }
  7. getName(){
  8. return this._name;
  9. }
  10. setAge(value: number) {
  11. this._age = value;
  12. }
  13. getAge() {
  14. return this._age;
  15. }
  16. }
  17. let item = new myClass()
  18. /* 设置 name 属性值 */
  19. item.setName('张三');
  20. /* 设置 age 属性值 */
  21. item.setAge(20);
  22. /* 获取 name 属性值 */
  23. item.getName();
  24. /* 获取 age 属性值 */
  25. item.getAge()

getName 和 setName 方法都是存取器
实例对象不能直接调用属性,可以保证数据的安全性

通过 getName 方法获取 name 属性值;通过 setName 方法设置 name 属性值

  1. class myClass {
  2. _name: string;
  3. _age: number;
  4. set name(value: string) {
  5. this._name = value;
  6. }
  7. get name(){
  8. return this._name;
  9. }
  10. set age(value: number) {
  11. this._age = value;
  12. }
  13. get age() {
  14. return this._age;
  15. }
  16. }
  17. let item = new myClass();
  18. /* 设置 name 属性值 */
  19. item.name = '张三';
  20. /* 设置 age 属性值 */
  21. item.age = 20;
  22. /* 获取 name 属性值 */
  23. console.log(item.name);
  24. /* 获取 age 属性值 */
  25. console.log(item.age);

TS 提高了更加简单的方法
get 和 set 方法都是存取器
item.name 实质是调用 get 和 set 方法