和其它面向对象编程语言一样,ES6正式定义了类类以及扩展继承语法糖,并且支持静态,派生,抽象,迭代,单例等,而且根据ES6的新特性衍生出很多有趣的用法。
基本所有面向对象的语言都支持类的封装与继承,那什么是类?
类是面向对象程序设计的基础,包含<强>数据封装,数据操作以及传递消息的函数>强。类的实例称为对象。
ES5之前通过函数来模拟类的实现如下:
//构造函数 函数的人(名字){ this.name=名称; }//原型上的方法 Person.prototype。sayName=function () { console.log (this.name); };//新建一个实例 var=新人朋友(“珍妮”); friend.sayName ();//珍妮 控制台。日志(朋友instanceof人);//正确的 控制台。日志(朋友instanceof对象);//正确的 >之前总结来说,定义一个类的思路如下:
1。需要构造函数封装数据
2.在原型上添加方法操作数据,
3.通过新的创建实例
ES6使用类关键字定义一个类,这个类有特殊的方法名[[制造]]定义构造函数,在新的创建实例时调用的就是[[制造]],示例如下:
/* ES6 *///等价于让人=类{ 类人{//构造函数 构造函数(名字){ this.name=名称; }//等价于Person.prototype.sayName sayName () { console.log (this.name); } } 控制台。日志(typeof人);//函数 控制台。日志(typeof Person.prototype.sayName);//函数 让朋友=new人(“珍妮”); friend.sayName ();//珍妮 控制台。日志(朋友instanceof人);//正确的 控制台。日志(朋友instanceof对象);//正确的 >之前上面的例子中类定义的类与自定义的函数模拟类功能上貌似没什么不同,但本质上还有很大差异的:
-
<李>函数声明可以被提升,但是类类声明与让类似,不能被提升,李>
<李>类声明自动运行在严格模式下,“使用严格的”,李>
<李>类中所有方法都是不可枚举的,可列举的为假的。李>
类和函数一样,是JavaScript的一等公民(可以传入函数,从函数返回,赋值),并且注意到类与对象字面量还有更多相似之处,这些特点可以扩展出类更灵活的定义与使用。
<强> 2.1拥有访问器属性强>
对象的属性有数据属性和访问属性,类中也可以通过,集关键字定义访问器属性:
类人{ 构造函数(名字){ this.name=名称; } 得到的值(){ 返回this.name + this.age } 设置值(num) { 这一点。年龄=num } } 让朋友=new人(“珍妮”);//调用的是setter 朋友值=https://www.yisu.com/zixun/18//调用的是getter//Jenny18 console.log (friend.value) >之前<强> 2.2可计算的成员名称强>
类似ES6对象字面量扩展的可计算属性名称,类也可以用[表达式]定义可计算成员名称,包括类中的方法和访问器属性:
让methodName=' sayName ' 类人{ 构造函数(名字){ this.name=名称; } [methodName +‘默认’](){ console.log (this.name); } get (methodName) () { 返回this.name } 设置(methodName) (str) { this.name=str } } 让朋友=new人(“珍妮”);//方法 friend.sayNameDefault ();//珍妮//访问器属性 朋友sayName=袄睢? 李console.log (friend.sayName)//>之前想进一步熟悉对象新特性可参考:【ES6】对象的新功能与解构赋值
<强> 2.3定义默认迭代器强>
ES6中常用的集合对象(数组,设置/映射集合)和字符串都是可迭代对象,如果类是用来表示值这些可迭代对象的,那么定义一个默认迭代器会更有用。
ES6通过给Symbol.iterator属性添加生成器的方式,定义默认迭代器:
类人{ 构造函数(名字){ this.name=名称; } * [Symbol.iterator] () { (让项this.name) { 收益项 } } } var abbrName=新人(新([' j ', ' j ', ' e ', ' e ', ' n ', ' y ', ' y ', ' y ',))) (让x abbrName) { console.log (x);//j e n y } console.log (…abbrName)//j e n yES6更易于继承的类语法的使用