TS支持的ES6类(包含一些仅TS支持的特性)

157 阅读3分钟

TS支持的ES6类.png

TS支持的ES6类

继承

ES6提供了extends用于实现单继承

  • 单继承

    • 单继承是指一个类只能有一个父类
  • 语法

    • 如果想要实现继承,那么必须在子类的构造器中调用父类的构造器。(使用super()可以调用父类的构造器,传给super()的参数就是传给父类构造器的参数)。

静态

ES6的类支持静态成员(静态属性和静态函数)

  • 静态成员会被所有实例共享。

访问修饰符(仅TS可用,当TS被编译为JS后访问修饰符就不再有意义)

ES6支持访问修饰符,它们决定了成员的可访问性。

  • public (默认,如果不指定访问修饰符,那么默认是public)

    • 类、子类、实例都可以访问。
  • protected

    • 类、子类可以访问。
    • 实例不可以访问。
  • private

    • 类内部可以访问。
    • 子类和实例都不可以访问。

abstract

abstract可以作用在类以及类的任何成员上。(有点类似于C++中的接口)。

  • 当使用abstract来修饰一个类

    • 那么这个类不能被实例化,我们必须创建一个类来继承abstract类。
  • 当使用abstract来修饰一个成员(方法或变量)

    • 那么子类必须实现这个方法或变量。

构造器(constructor)

构造器对于一个类来说是可选的,并不是每一个类都要有一个构造器。

构造器的作用

  • 构造器可以用来初始化变量

    • 同时在类的构造器中初始化的变量会直接是实例的属性,而放在构造器之外的方法、变量等,则会存在于实例的原型对象上。(实例的原型对象使用__proto__访问)。

      class Foo{
        constructor(x){
          this.number = x;
        }
      
        getX(){
            return this.number}
        }
      }
      const obj = new Foo(1)
      console.log(obj)
      console.log(obj.__proto__)
      

属性初始化

ES7支持在类的构造器外初始化类的成员(变量或方法)。

  • 构造器外初始化的成员允许提供一个默认值,同时我们也可以在构造器中对它们覆盖赋值。

    • 如果在构造器中对他们覆盖赋值了,那么这个成员就将存在于实例上,否则它们将存在于实例的原型对象上。

      class Foo{
        number = 0
        constructor(x){
          this.number = x;
        }
      }
      const obj = new Foo(1)
      console.log(obj)
      

__proto__和prototype

prototype

  • JS的所有函数都存在一个prototype属性,它将指向一个对象,这个对象是通过构造函数或构造器创造的实例的原型对象。

    • 同样所有原型对象上存在一个属性constructor指向与之关联的构造函数。
    • 当自定义类或构造函数,构造器/构造函数的prototype属性指向的原型对象中只存在一个constructor属性,并且其他变量/方法都将通过__proto__从Object继承。

proto

  • 每次调用构造函数创建实例时,由于new操作符的原理,新对象的[[prototype]]特性会被赋值为这个构造函数的prototype属性指向的原型对象。

    • 而由于浏览器不支持直接访问[[prototype]]特性,所以浏览器实现了一个__proto__属性指向[[prototype]]特性。