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 相关文章推荐
自己编写的类似JS的trim方法
Oct 09 Javascript
页面定时刷新(1秒刷新一次)
Nov 22 Javascript
jQuery文字提示与图片提示效果实现方法
Jul 04 Javascript
js如何判断是否在iframe中及防止网页被别站用iframe嵌套
Jan 11 Javascript
Bootstrap3多级下拉菜单
Feb 24 Javascript
Angular4学习笔记之根模块与Ng模块
Sep 09 Javascript
jQuery实现百度图片移入移出内容提示框上下左右移动的效果
Jun 05 jQuery
使用Vue-cli 3.0搭建Vue项目的方法
Jun 07 Javascript
使用jquery-easyui的布局layout写后台管理页面的代码详解
Jun 19 jQuery
vue+webpack 更换主题N种方案优劣分析
Oct 28 Javascript
vue style width a href动态拼接问题的解决
Aug 07 Javascript
在Vue中使用Echarts可视化库的完整步骤记录
Nov 18 Vue.js
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网页显示各种语法错误
2013/09/23 PHP
PHP curl伪造IP地址和header信息代码实例
2015/04/27 PHP
PHP正则获取页面所有图片地址
2016/03/23 PHP
PHP attributes()函数讲解
2019/02/03 PHP
SWFObject Flash js调用类
2008/07/08 Javascript
读jQuery之三(构建选择器)
2011/06/11 Javascript
关于jQuery的inArray 方法介绍
2011/10/08 Javascript
JavaScript中json对象和string对象之间相互转化
2012/12/26 Javascript
javaScript 动态访问JSon元素示例代码
2013/08/30 Javascript
javascript中兼容主流浏览器的动态生成iframe方法
2014/05/05 Javascript
Angular2学习笔记——详解路由器模型(Router)
2016/12/02 Javascript
Angular 2.0+ 的数据绑定的实现示例
2017/08/09 Javascript
Iview Table组件中各种组件扩展的使用
2018/10/20 Javascript
微信小程序在地图选择地址并返回经纬度简单示例
2018/12/03 Javascript
javascript的this关键字详解
2019/05/20 Javascript
基于Vue实现微前端的示例代码
2020/04/24 Javascript
[56:46]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VP vs Effect
2018/04/01 DOTA
基于Python Shell获取hostname和fqdn释疑
2016/01/25 Python
Python使用Mechanize模块编写爬虫的要点解析
2016/03/31 Python
python 实现分页显示从es中获取的数据方法
2018/12/26 Python
PyQT实现菜单中的复制,全选和清空的功能的方法
2019/06/17 Python
解决pytorch 的state_dict()拷贝问题
2021/03/03 Python
CSS3教程(4):网页边框和网页文字阴影
2009/04/02 HTML / CSS
Coccinelle官网:意大利的著名皮具品牌
2019/05/15 全球购物
团日活动策划书
2014/02/01 职场文书
商务经理岗位职责
2014/08/03 职场文书
工作证明范本(2篇)
2014/09/14 职场文书
2014向国旗敬礼网上签名活动总结
2014/09/27 职场文书
公司法定代表人授权委托书
2014/09/29 职场文书
2014年会计个人工作总结
2014/11/24 职场文书
医院中层管理人员培训心得体会
2016/01/11 职场文书
小学英语听课心得体会
2016/01/14 职场文书
《田忌赛马》教学反思
2016/02/19 职场文书
python实现图片九宫格分割的示例
2021/04/25 Python
Go Plugins插件的实现方式
2021/08/07 Golang
Win11怎样将锁屏账户头像图片改成动画视频
2021/11/21 数码科技