JavaScript ES6 Class类实现原理详解

作者:阿吉莱加雷 时间:2024-02-24 07:54:49 

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

静态的使用场景:

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

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

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

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

来源:https://www.cnblogs.com/cpfblogs/p/12687712.html

标签:JavaScript,ES6,Class,类
0
投稿

猜你喜欢

  • PyTorch上搭建简单神经网络实现回归和分类的示例

    2022-08-02 04:49:42
  • asp中InstrRev的语法

    2008-01-22 18:14:00
  • JavaScript预解析及相关技巧分析

    2024-04-10 10:57:32
  • Python函数中的可变长参数详解

    2022-08-01 06:04:57
  • Vue watch原理源码层深入讲解

    2024-04-30 10:40:58
  • Python学习笔记之迭代器和生成器用法实例详解

    2021-07-15 21:25:04
  • pyramid配置session的方法教程

    2021-04-26 09:23:37
  • python简单文本处理的方法

    2023-08-31 12:33:01
  • Python离线安装PIL 模块的方法

    2023-02-19 22:38:37
  • Python语言中Tuple的由来分析

    2021-07-01 16:36:11
  • python对矩阵进行转置的2种处理方法

    2023-12-01 09:18:17
  • python 列表输出重复值以及对应的角标方法

    2021-06-19 13:29:57
  • 关于SQL Server中索引使用及维护简介

    2008-12-24 15:39:00
  • Oracle复合索引与空值的索引使用问题小结

    2024-01-21 17:35:38
  • [翻译]标记语言和样式手册 Chapter 8 再谈清单

    2008-01-29 13:16:00
  • Python发展简史 Python来历

    2021-12-17 11:16:37
  • Python实现清理微信僵尸粉功能示例【基于itchat模块】

    2021-10-29 20:45:46
  • 用javascript实现自定义标签

    2024-04-17 10:20:10
  • vue-cli脚手架引入弹出层layer插件的几种方法

    2023-07-02 17:04:29
  • Oracle数据库表空间超详细介绍

    2024-01-17 16:49:22
  • asp之家 网络编程 m.aspxhome.com