class

Class

定义

  ES6的class是一种语法糖

定义类

  1. class类中方法以及构造器中没有逗号分隔
  2. typeof Point => function 是函数
  3. Point => Point.prototype.constructor
  4. 类必须使用关键字new
    1. 自动调用constructor的构造方法
    2. constructor这个方法必须有的
    3. 如果没有显式的定义,js引擎会默认添加一个空的
  5. 类的所有方法都定义在类的prototype属性上面,包括构造方法(与ES5一致,构造器指向类的本身)
    • instanceObj.constructor === Point.prototype.constructor
    • Point.prototype.constructor === Point
  6. 类的内部所有定义的方法,都是不可枚举的
    • ES5可以获取到prototype里面的所有方法
    • ES5除了constructor这个属性是唯一不可枚举的
  7. 类的属性名可以采用表达式
  8. 类的内部以及模块的内部已经采用了严格模式
  9. constructor默认return this;
  10. 不存在变量提升

example(class)

const bar = Symbol("bar");
class Point {
  constructor(x, y) {
    // 构造器(构造方法)
    // this指代实例对象
    // 这些属性都属于实例对象自身的属性
    this.x = x;
    this.y = y;
    return this; // 默认是返回的是Point
    // return { // 这样的话就返回的是新的对象
    //   a:1,
    //   b:1
    // };
    // return '我是字符串'; // 这样还是返回的是this
  }
  // class有存值函数(setter),以及取值函数(getter)设置在属性的Descriptor对象上
  get prop() {
    return "getter";
  }
  set prop(value) {
    console.log("setter: " + value);
  }
  /**
   *  私有方法
   *  1:通过命名方法加以区别(前面加_play()一般这种就是私有方法)
   *  2:将私有方法移出class模块function bar(baz) {return this.snaf = baz;}
   *  3:利用Symbol值的唯一性将私有方法命名为一个Symbol值
   **/
  // 方法定义 => 原型上的方法
  toString() {
    return "(" + this.x + ", " + this.y + ")";
  }
  [bar]() {
    console.log(
      "利用Symbol来创建私有方法,当你导出的时候是获取不到这个值的因为导出的时候只是导出class并没有把命名的变量Symbol进行导出"
    );
  }
  // 该static 证明是类的静态方法,只能通过类来调用,实例不能继承下来
  // 如果静态方法中有this,那么这个this指的是类本身,并不是实例
  // 静态方法可以与非静态方法重名
  // 静态方法可以被继承
  static setPoint() {}
}
var instanceObj = new Point();
console.log(Point.name); // class有个name属性

类的继承

  1. 继承的机制
    • es6:先将父类实例对象的属性和方法加到this上面(所以必须先调用super方法),然后再用子类的构造函数修改this
    • es5:先创建子类实例,利用Father.apply(this)来继承父类的构造器
  2. 子类会继承父类的静态方法
    • 可以是采用extends来实现继承

example(extends)

class ColorPoint extends Point {
  constructor(x, y, color) {
    // 调用父类的构造器,用来新建父类的this,这里的super必须
    // 子类只有调用super之后才能使用this(子类实例的构建,基于父类的实例)
    // super作为函数 => super()只能用于子类的构造函数中,别的地方会报错
    // super作为对象 => 指向父类的原型对象;在静态方法中,指向父类
    super(x, y);
    this.color = color;
  }
}

  转载请注明: 迷一样的自信 class

 上一篇
typeof 与instanceof的区别 typeof 与instanceof的区别
typeof、instanceof的区别typeof  number,boolean,string,function,object,undefined instanceof  一般判断a变量是否是b变量的实例或者子类 examplevar
2018-02-01
下一篇 
apply、call、bind apply、call、bind
apply、call、bind的用法apply 参数一: 改变this的指向(不传参,默认指代当前环境的this) 参数二: 数组,但是实际的话他会以...arguments呈现(也就是说会把数组转化为参数列表)['a',&
2018-01-26
  目录