zoukankan      html  css  js  c++  java
  • js-ES6学习笔记-Class(6)

    1、类相当于实例的原型,所有在类中定义的方法,都会被实例继承。如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”。

    2、父类的静态方法,可以被子类继承。静态方法也是可以从super对象上调用的。

    3、静态属性指的是Class本身的属性,即Class.propname,而不是定义在实例对象(this)上的属性。

    ES6明确规定,Class内部只有静态方法,没有静态属性。

    // 以下两种写法都无效
    class Foo {
      // 写法一
      prop: 2
    
      // 写法二
      static prop: 2
    }
    
    Foo.prop // undefined

    4、ES7有一个静态属性的提案,目前Babel转码器支持。

    这个提案对实例属性和静态属性,都规定了新的写法。

    (1)类的实例属性——类的实例属性可以用等式,写入类的定义之中。

    class ReactCounter extends React.Component {
      constructor(props) {
        super(props);
        this.state = {
          count: 0
        };
      }
    }

    上面代码中,构造方法constructor里面,定义了this.state属性。

    有了新的写法以后,可以不在constructor方法里面定义。

    class ReactCounter extends React.Component {
      state = {
        count: 0
      };
    }

    (2)类的静态属性

    类的静态属性只要在上面的实例属性写法前面,加上static关键字就可以了。

    5、目前,有一个提案,为class加了私有属性。方法是在属性名之前,使用#表示。

    6、new是从构造函数生成实例的命令。ES6为new命令引入了一个new.target属性,(在构造函数中)返回new命令作用于的那个构造函数。如果构造函数不是通过new命令调用的,new.target会返回undefined,因此这个属性可以用来确定构造函数是怎么调用的。

    function Person(name) {
      if (new.target !== undefined) {
        this.name = name;
      } else {
        throw new Error('必须使用new生成实例');
      }
    }
    
    // 另一种写法
    function Person(name) {
      if (new.target === Person) {
        this.name = name;
      } else {
        throw new Error('必须使用new生成实例');
      }
    }
    
    var person = new Person('张三'); // 正确
    var notAPerson = Person.call(person, '张三');  // 报错

    Class内部调用new.target,返回当前Class。需要注意的是,子类继承父类时,new.target会返回子类。

    利用这个特点,可以写出不能独立使用、必须继承后才能使用的类。

    class Shape {
      constructor() {
        if (new.target === Shape) {
          throw new Error('本类不能实例化');
        }
      }
    }
    
    class Rectangle extends Shape {
      constructor(length, width) {
        super();
        // ...
      }
    }
    
    var x = new Shape();  // 报错
    var y = new Rectangle(3, 4);  // 正确

    7、Mixin模式指的是,将多个类的接口“混入”(mix in)另一个类。可以将多个对象合成为一个类。使用的时候,只要继承这个类即可。

  • 相关阅读:
    汉字编码问题
    C语言创建UTF8编码文本文件
    Know more about shared pool subpool
    SCN Headroom与时光倒流到1988年的Oracle数据库
    Know more about Enqueue Deadlock Detection
    11g新特性:RDBMS Component TRACE
    了解你所不知道的SMON功能(十一):OFFLINE UNDO SEGMENT
    了解11g OCM
    Bulk Collect/FORALL的性能测试
    【推荐】DBA必须了解的11g中的一些变化
  • 原文地址:https://www.cnblogs.com/zczhangcui/p/6550570.html
Copyright © 2011-2022 走看看