欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JavaScript ES6 Class类实现原理详解

程序员文章站 2024-01-02 11:26:16
javascript es6之前的还没有class类的概念,生成实例对象的传统方法是通过构造函数。例如:function mold(a,b){ this.a=a; th...

javascript es6之前的还没有class类的概念,生成实例对象的传统方法是通过构造函数。

例如:

function mold(a,b){
         this.a=a;
         this.b=b;
     }
     mold.prototype.count=function(){
       return this.a+this.b;
     };
     let sum=new mold(1,2);
    console.log(sum.count())  //3

这中写法跟传统的面向对象语言差异较大,写起来也比较繁杂。

es6提供了更加接近其他语言的写法,引入了class(类)的概念,作为对象的模板,可以通过class关键字,定义类(类似python、java等);

当然es6的大部分功能再es5都能实现,es6的class可以看作是一个语法糖,只是新的class定义类的写法让对象原型的写法更加简单明了、更接近与面向对象的编程思想。与上面es5写的类使用es6实现,例如:

class mold{
       constructor(a,b){
         this.a=a;
         this.b=b;
       }
       count(){
         return this.a+this.b;
       }
    }
    let sum=new mold(1,2);
    console.log(sum.count())  //3

这里es6的类,只需用class定义,并且类的方法不需要用function定义;还有es6的constructor方法,代表这该类的构造方法;并且它的this关键字指向着实例对象。这里es5的构造函数mold,相当于es6mold类的constructor方法。

constructor

es6实例对象的构造函数就是该类本身;并且当我们new 类名()就是执行了constructor这个函数。

例如:

class mold{
       constructor(){
        console.log("aaa")
       }
    }
 let m=new mold();// aaa
 console.log(m.constructor===mold);//true

上面代码mold类的constructor,实例化对象时执行默认constructor;

任何对象都有构造函数,并且构造函数与当前对象的类是相同;

例如:

let arr=new array();
 console.log(arr.constructor===array);//true
 let str=new string();
 console.log(str.constructor===string);//true
 let obj=new object();
 console.log(obj.constructor===object);//true

  2. 类的继承 extends

继承父类后,子类会继承父类所有的方法和属性(包括静态方法和属性)

如果子类没有定义constructor方法,会默认被添加该方法

任何子类都有constructor方法;

例如:

//class 类名 extends 被继承的类{}
class father{
   constructor(){
   }
   sum(){
     console.log("abc");
   }
   static fn(){
     console.log("hello")
   }
 }
 class son extends father{
  
 }
 let s=new son();
 s.sum()//abc,继承了父类的sum()方法
 son.fn()//hello 继承了父类的静态方法fn()

继承后的子类方法的三种处理:

1). 完全继承,不需要重写这个方法,子类执行继承方法内容与父类相同

2). 重写覆盖,只需要在这个类中重写这个方法就可以覆盖继承过来的内容

3). 加工,子类可以用super调用父类的方法或属性进行加工,再加上子类自己的方法和属性

  3. super

调用父类的构造函数直接使用super(),并且可以传参;

子类的构造函数中,只有调用了super之后才可以使用this关键字,否则会报错;

例如:

//super.父类函数();
 class father{
   constructor(){
    console.log("bbb");
   }
 }
 class son extends father{
   constructor(x){
    this.x=x;//referenceerror,报错
    super();
    this.x=x;//正确
   }
 }
 let sum=new son();//bbb

  4. 类的static静态

在属性或方法前面使用 static定义类的静态属性和方法;

所有的静态属性和静态方法都不能通过实例化的对象调用;

需要通过类来调用,静态属性和静态方法是类的专属属性和方法,和实例化对象无关,比如数组和数学方法中的:array.from();math.random()。

例如:

class mold{
     static x=0;
     y=1;
     static fn1(){
       console.log("aaa")
     }
     fn2(){
       console.log("bbb");
     }
    }
   let m=new mold();
   console.log(m.x,m.y);//undefined , 1
   m.fn1(); // typeerror 
   m.fn2(); // bbb
   //需要通过类来调用
   mold.fn1(); //aaa
   console.log(mold.x);//0

静态的使用场景:

一般静态的方法是用来解决一系列该类型的方法;

解决具体类型的方法,不是解决某个具体对象的方法

静态属性,一般用于存储该类型的一系列通用的属性变量

这种存储,在类创建的时候就已经变成全局的了,可在任何地方调用,并且不会被自动销毁

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

上一篇:

下一篇: