JS ES6中Class类实现原理是什么
Admin 2022-10-13 群英技术资讯 678 次浏览
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
静态的使用场景:
一般静态的方法是用来解决一系列该类型的方法;
解决具体类型的方法,不是解决某个具体对象的方法
静态属性,一般用于存储该类型的一系列通用的属性变量
这种存储,在类创建的时候就已经变成全局的了,可在任何地方调用,并且不会被自动销毁
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
现在很多商家、组织、单位等等都有自己的微信小程序,我们能方便快捷的在小程序商实现自己想要的服务,其中有一些服务需要我们个人签名,那么微信小程序上的电子签名功能是怎样实现的呢?接下来小编就带大家来了解一下。
前言用Vue3实现一个简易的音乐播放器组件其效果图如下所示:实现这个组件需要提前做的准备:引入ElementUI引入字节跳动图标库一张唱见图片将要播放的音乐上传到文件服务器上,并提供一个能在线访问的链接【这里使用的是阿里云的OSS服务】准备ElementUIElementUI的引入可以参照其官网的引入方式;字节跳动图标
在前端开发时,点击父菜单弹出子菜单功能是比较经常遇到需求,这篇文章就主要介绍用JavaScript实现点击出现子菜单,以下是简易的实现效果以及具体代码展示,感兴趣的朋友就继续往下看吧。
这篇文章主要给大家介绍echarts饼图分区之间的空隙效果实现,这个效果能明显的各个板块的占比,实现效果及代码如下,感兴趣的朋友接下来跟随小编一起了解看看吧。
本文主要介绍了TypeScript 接口继承的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008