JavaScript ES6 Class类实现原理详解


Posted in Javascript onMay 08, 2020

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

静态的使用场景:

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

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

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

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

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

Javascript 相关文章推荐
用javascript实现读取txt文档的脚本
Jul 20 Javascript
javascript 动态数据下的锚点错位问题解决方法
Dec 24 Javascript
分享一道笔试题[有n个直线最多可以把一个平面分成多少个部分]
Oct 12 Javascript
jQuery+JSON+jPlayer实现QQ空间音乐查询功能示例
Jun 17 Javascript
JavaScript对Json的增删改属性详解
Jun 02 Javascript
真正好用的js验证上传文件大小的简单方法
Oct 27 Javascript
基于vue.js轮播组件vue-awesome-swiper实现轮播图
Mar 17 Javascript
浅谈angular.copy() 深拷贝
Sep 14 Javascript
浅谈Angular4中常用管道
Sep 27 Javascript
详解使用jest对vue项目进行单元测试
Sep 07 Javascript
vue data恢复初始化数据的实现方法
Oct 31 Javascript
通过js实现压缩图片上传功能
Feb 25 Javascript
JavaScript cookie原理及使用实例
May 08 #Javascript
JavaScript中的各种宽高属性的实现
May 08 #Javascript
element-ui 实现响应式导航栏的示例代码
May 08 #Javascript
JS控制下拉列表左右选择实例代码
May 08 #Javascript
VSCode搭建React Native环境
May 07 #Javascript
Javascript查看大图功能代码实现
May 07 #Javascript
用VsCode编辑TypeScript的实现方法
May 07 #Javascript
You might like
如何使用脚本模仿登陆过程
2006/11/22 PHP
php设计模式 Composite (组合模式)
2011/06/26 PHP
PHP常用编译参数中文说明
2014/09/27 PHP
php动态生成版权所有信息的方法
2015/03/24 PHP
php intval函数用法总结
2019/04/14 PHP
跨域表单提交状态的变相判断代码
2009/11/12 Javascript
使用JS+plupload直接批量上传图片到又拍云
2014/12/01 Javascript
js实现兼容IE和FF的上下层的移动
2015/05/04 Javascript
jQuery获取attr()与prop()属性值的方法及区别介绍
2016/07/06 Javascript
JavaScript实现图片懒加载(Lazyload)
2016/11/28 Javascript
原生js封装自定义滚动条
2017/03/24 Javascript
[js高手之路]设计模式系列课程-发布者,订阅者重构购物车的实例
2017/08/29 Javascript
微信小程序授权获取用户详细信息openid的实例详解
2017/09/20 Javascript
微信小程序使用image组件显示图片的方法【附源码下载】
2017/12/08 Javascript
vue-cli2.x项目优化之引入本地静态库文件的方法
2018/06/19 Javascript
Vue加载组件、动态加载组件的几种方式
2018/08/31 Javascript
图解JS原型和原型链实现原理
2020/09/15 Javascript
[09:33]2015国际邀请赛第四日TOP10
2015/08/08 DOTA
[54:05]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第一场 1月9日
2021/03/11 DOTA
简介二分查找算法与相关的Python实现示例
2015/08/26 Python
Python自动化部署工具Fabric的简单上手指南
2016/04/19 Python
Python脚本实现自动将数据库备份到 Dropbox
2017/02/06 Python
Python通过Manager方式实现多个无关联进程共享数据的实现
2019/11/07 Python
python爬虫模拟浏览器访问-User-Agent过程解析
2019/12/28 Python
python 在sql语句中使用%s,%d,%f说明
2020/06/06 Python
浅谈Python3中print函数的换行
2020/08/05 Python
利用SVG和CSS3来实现一个炫酷的边框动画
2015/07/22 HTML / CSS
HTML5 本地存储实现购物车功能
2017/09/07 HTML / CSS
使用html5新特性轻松监听任何App自带返回键的示例
2018/03/13 HTML / CSS
施华洛世奇新加坡官网:SWAROVSKI新加坡
2020/10/06 全球购物
学前教育毕业生自荐信范文
2013/12/24 职场文书
应届实习生的自我评价范文
2014/01/05 职场文书
面试后的英文感谢信
2014/02/01 职场文书
工作检讨书怎么写
2015/01/23 职场文书
JavaScript利用html5新方法操作元素类名详解
2021/11/27 Javascript
浅谈css清除浮动(clearfix和clear)的用法
2023/05/21 HTML / CSS