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 Math.random()随机数函数
Nov 04 Javascript
GreyBox技术总结(转)
Nov 23 Javascript
js中浮点型运算BUG的解决方法说明
Jan 06 Javascript
jquery中ready()函数执行的时机和window的load事件比较
Jun 22 Javascript
Bootstrap页面缩小变形的快速解决办法
Feb 03 Javascript
Vue.js手风琴菜单组件开发实例
May 16 Javascript
js + css实现标签内容切换功能(实例讲解)
Oct 09 Javascript
Angular4集成ng2-file-upload的上传组件
Mar 14 Javascript
微信小程序 wepy框架与iview-weapp的用法详解
Apr 10 Javascript
浅析微信小程序modal弹窗关闭默认会执行cancel问题
Oct 14 Javascript
javascript实现滚动条效果
Mar 24 Javascript
在Vue 中实现循环渲染多个相同echarts图表
Jul 20 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
《PHP编程最快明白》第四讲:日期、表单接收、session、cookie
2010/11/01 PHP
php给一组指定关键词添加span标签的方法
2015/03/31 PHP
php实现的统计字数函数定义与使用示例
2017/07/26 PHP
win7 wamp 64位 php环境开启curl服务遇到的问题及解决方法
2018/09/16 PHP
Extjs优化(一)删除冗余代码提高运行速度
2013/04/15 Javascript
在js文件中如何获取basePath处理js路径问题
2013/07/10 Javascript
经过绑定元素时会多次触发mouseover和mouseout事件
2014/02/28 Javascript
基于javascript实现的搜索时自动提示功能
2014/12/26 Javascript
JavaScript中通过prototype属性共享属性和方法的技巧实例
2015/03/13 Javascript
nodejs调用cmd命令实现复制目录
2015/05/04 NodeJs
JavaScript使用FileSystemObject对象写入文本文件内容的方法
2015/08/05 Javascript
详解JavaScript中|单竖杠运算符的使用方法
2016/05/23 Javascript
js获取客户端操作系统类型的方法【测试可用】
2016/05/27 Javascript
jQuery实现的表格展开伸缩效果实例
2016/09/07 Javascript
详解vue-router 2.0 常用基础知识点之router.push()
2017/05/10 Javascript
Angular使用ControlValueAccessor创建自定义表单控件
2019/03/08 Javascript
python模拟登录百度代码分享(获取百度贴吧等级)
2013/12/27 Python
Python实现的数据结构与算法之双端队列详解
2015/04/22 Python
Python操作Excel之xlsx文件
2017/03/24 Python
Python2.7基于淘宝接口获取IP地址所在地理位置的方法【测试可用】
2017/06/07 Python
解决win64 Python下安装PIL出错问题(图解)
2018/09/03 Python
浅谈python 中的 type(), dtype(), astype()的区别
2020/04/09 Python
Python Mock模块原理及使用方法详解
2020/07/07 Python
纯css3使用vw和vh实现自适应的方法
2018/02/09 HTML / CSS
应用艺术专业个人的自我评价
2014/01/03 职场文书
师德师风自我评价范文
2014/09/11 职场文书
公安局班子个人对照检查材料思想汇报
2014/10/09 职场文书
邀请函模板
2015/02/02 职场文书
小学生安全教育主题班会
2015/08/12 职场文书
css背景和边框标签实例详解
2021/05/21 HTML / CSS
这样写python注释让代码更加的优雅
2021/06/02 Python
用Python创建简易网站图文教程
2021/06/11 Python
《勇者辞职不干了》ED主题曲无字幕动画MV公开
2022/04/13 日漫
Java8利用Stream对列表进行去除重复的方法详解
2022/04/14 Java/Android
MYSQL事务的隔离级别与MVCC
2022/05/25 MySQL
table设置超出部分隐藏,鼠标移上去显示全部内容的方法
2022/12/24 HTML / CSS