独特的class的味道!

109 阅读1分钟

class曼妙身姿

class Person {
    constructor(name){
        this.name = name;
    }
    
    //普通函数
    say(){
        console.log(name)
    }
    
    //存值函数和取值函数
    get getName(){
     return name;
    }
    
    set setName(val){
        this.name = val;
    }
    
    //generator函数
    *hello(){
        yield 'world'
    }
    
    //静态函数
    //该方法不会被实例继承,可被子类继承,this指向类
    static method(){
        return 123;
    }
    
    //实例属性
    age = 18;
    
    //静态属性
    static age = 20;
}

class的蔓延

在es5的继承

原型链的继承

myintance.prototype = new person();

构造函数的继承

myintance(){
  Person.call(this)
}

在es6的继承

class myintance extends Person{
  construtor(){
      super()   //必须调用super(),本质是对父类构造函数的调用和继承,里面的this指向myinstance实例调用之后子类才可以使用this对象;
  }
}

super的两大作用,一个做函数使用,一种是作对象使用;

函数使用时,实质代表父类的构造函数,super内部的this指向子类;

作为对象使用时,代表父类的原型对象,在调用静态方法时,指向父类;1、通过super调用父类原型对象的属性和方法;2、调用普通方法时,里面的this是指向子类;3、给属性赋值时,super.x = 3,这时super指向子类实例;4;调用静态方法时,指向父类本身。

class的prototype属性和_proto_属性

class作为语法糖,同时具有prototype属性和_proto_属性

当作为对象理解时,class的_proto_属性指向父类,即myintance.proto = Person;

当作为构造函数理解时,class的prototype属性指向父类的实例,即myintance.prototype.proto = Person.prototype,也可理解为父类的实例的_proto_指向父类的原型。