1.Class

  • 通过class的形式添加
  • class Num{
        constructor(...args){
            for( let i in args ){
                this[i]=args[i];
            }
        }
        add(){
            let total=0;
            for( let i in this ){
                if( typeof this[i] ==="number" ){ total+=this[i] }
            }
            return total;
        }
    }
    let a=new Num(1,2,3,4,5); //这里new了一个Num实例赋值给a
    a.add() //15 add方法在a.__proto__上面

    特别注意:class xxx{ } ,xxx后面不能加()括号 可以及时分号;

    方法与方法之间,不能加逗号,

    • 当new一个实例时,就调用了constructor方法
    • 类和模块默认使用严格模式
    • 类没有变量提升
    • ### 类的静态方法不能被实例调用,只能被类调用
      class Num{
          constructor(...args){
              this.args=args;
              for( let i in args ){
                  this[i]=args[i];
              }
          }
          static add(obj){
              let total=0;
              for( let i in obj ){
                  if( typeof obj[i] ==="number" ){ total+=obj[i] }
              }
              return total;
          }
      }
      var a=new Num(5,8,6,1);
      a.add //undefined
      Num.add(a); // 20

    特别注意:静态方法的this指向的是类,而不是实例;静态方法与非静态方法可以重名

  • new.target用于构造函数内判断实例是不是new出来的,返回值是当前的class
  •   function Person(name="",sex="保密",age=20){
          if( new.target ){
              this.name=name;
              this.sex=sex;
              this.age=age;
          }else{
              return "不允许直接调用";
          }
      }
      var p=new Person("jpc","男",19); //{name: "jpc", sex: "男", age: 19}
      Person("jpc","男",19); //不允许直接调用
    • 类的继承 使用extens的方法进行继承
      class Father{
    
      }
      class Children extends Father{
    
      }

    子类中的构造函数constructor必须调用super方法,否则报错,如果子类里没有构造函数默认会添加调用

  • 类的继承中的原型链
  •   class A {
      }
    
      class B extends A {
      }
    
      B.__proto__ === A // true
      B.prototype.__proto__ === A.prototype // true

    一个人只有亲眼看到自己伤疤的时候才知道什么是痛,什么是对与错。