JavaScript ES6中CLASS的使用指南
1、前言
对于javascript来说,类是一种可选(而不是必须)的设计模式,而且在JavaScript这样的[[Prototype]] 语言中实现类是很蹩脚的。
这种蹩脚的感觉不只是来源于语法,虽然语法是很重要的原因。js里面有许多语法的缺点:繁琐杂乱的otype 引用、试图调用原型链上层同名函数时的显式伪多态以及不可靠、不美观而且容易被误解成“构造函数”的tructor。
除此之外,类设计其实还存在更进一步的问题。传统面向类的语言中父类和子类、子类和实例之间其实是复制操作,但是在[[Prototype]] 中并没有复制。
对象关联代码和行为委托使用了[[Prototype]] 而不是将它藏起来,对比其简洁性可以看出,类并不适用于JavaScript。
2、ES6中CLASS的使用
javascript传统做法是当生成一个对象实例,需要定义构造函数,然后通过new的方式完成。
function StdInfo(){ = "job"; = 30; }ames = function (){ ("name:"+); }//得到一个学员信息对象var p = new StdInfo()
javacript中只有对象,没有类。它是是基于原型的语言,原型对象是新对象的模板,它将自身的属性共享给新对象。这样的写法和传统面向对象语言差异很大,很容易让新手感到困惑。
3、定义类
到了ES6添加了类,作为对象的模板。通过class来定义一个类:
//定义类class StdInfo { constructor(){ = "job"; = 30; } //定义在类中的方法不需要添加function getNames(){ ("name:"+); }}//使用new的方式得到一个实例对象var p = new StdInfo();
上面的写法更加清晰、更像面向对象编程的语法,看起来也更容易理解。
定义的类只是语法糖,目的`是让我们用更简洁明了的语法创建对象及处理相关的继承。
//定义类class StdInfo { //...}(typeof StdInfo); //(StdInfo === tructor); //true
从上面的测试中可以看出来,类的类型就是一个函数,是一个“特殊函数”,指向的是构造函数。
函数的定义方式有函数声明和函数表达式两种,类的定义方式也有两种,分别是:类声明和类表达式。
4、类声明
类声明是定义类的一种方式,使用关键字class,后面跟上类名,然后就是一对大括号。把这一类需要定义的方法放在大括号中。
//定义类,可以省略constructorclass StdInfo { getNames(){ ("name:"+); }}// -------------------------------------//定义类,加上constructorclass StdInfo { //使用new定义实例对象时,自动调用这个函数,传入参数 constructor(name,age){ = name; = age; } getNames(){ ("name:"+); }}//定义实例对象时,传入参数var p = new StdInfo("job",30)
constructor是一个默认方法,使用new来定义实例对象时,自动执行constructor函数,传入所需要的参数,执行完constructor后自动返回实例对象。
一个类中只能有一个constructor函数,定义多个会报错。
constructor中的this指向新创建的实例对象,利用this往新创建的实例对象扩展属性。
在定义实例对象时,不需要在初始化阶段做一些事,可以不用显示的写constructor函数。如果没有显式定义,一个空的constructor方法会被默认添加,constructor(){}
5、类表达式
类表达式是定义类的另一种形式,类似于函数表达式,把一个函数作为值赋给变量。可以把定义的类赋值给一个变量,这时候变量就为类名。class关键字之后的类名可有可无,如果存在,则只能在类内部使用。
定义类 class后面有类名:
const People = class StdInfo { constructor(){ (StdInfo); //可以打印出值,是一个函数 }}new People();new StdInfo(); //报错,StdInfo is not defined;
定义类 class后面没有类名:
const People = class { constructor(){ }}new People();
立即执行的类:
const p = new class { constructor(name,age){ (name,age); }}("job",30)
立即执行的类,在类前要加上new。p为类的实例对象。
6、不存在变量提升
定义类不存在变量提升,只能先定义类后使用,跟函数声明有区别的。
//-----函数声明-------//定义前可以先使用,因为函数声明提升的缘故,调用合法。func();function func(){}//-----定义类---------------new StdInfo(); //报错,StdInfo is not definedclass StdInfo{}
7、EXTENDS继承
使用extends关键字实现类之间的继承。这比在ES5中使用继承要方便很多。
//定义类父类class Parent { constructor(name,age){ = name; = age; } speakSometing(){ ("I can speek chinese"); }}//定义子类,继承父类class Child extends Parent { coding(){ ("coding javascript"); }}var c = new Child();//可以调用父类的方法kSometing(); // I can speek chinese使用继承的方式,子类就拥有了父类的方法。
如果子类中有constructor构造函数,则必须使用调用super。
//定义类父类class Parent { constructor(name,age){ = name; = age; } speakSometing(){ ("I can speek chinese"); }}//定义子类,继承父类class Child extends Parent { constructor(name,age){ //不调super(),则会报错 this is not defined //必须调用super super(name,age); } coding(){ ("coding javascript"); }}var c = new Child("job",30);//可以调用父类的方法kSometing(); // I can speek chinese
子类必须在constructor方法中调用super方法,否则新建实例时会报错(this is not defined)。这是因为子类没有自己的this对象,而是继承父类的this对象,然后对其进行加工。如果不调用super方法,子类就得不到this对象。
8、总结
好了,以上就是对ES6中类的简单总结学习,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
-
解决Win7资源管理器总是在新窗口打开问题
默认情况下,打开Win7资源管理器都是在当前窗口下打开,但是不知是误操作什么了,现在打开文件夹,磁盘都是在新窗口打开,怎么办呢?其实这是Win7资源管理器文件夹选项被修改了,用户只要更改文件夹选项即可,方法如下:计算机—工具—文件夹选项,选择在同一窗口中打...
-
Excel中怎么设置自动保存
1.打开Excel工作簿,单击“文件”按钮,在弹出的下拉菜单中选择“选项”命令。2.在弹出的“Excel选项”对话框中,选择“保存”选项卡,在“保存工作簿”区域中勾选“如果我没保存就关闭,请保存上次自动保留的版本”复选框,在“自动恢复文件位置”的文本框中输入文件要保...
-
十大动漫游戏改编的电影介绍
以下是本站小编搜索整理的关于十大动漫游戏改编的电影介绍,欢迎参考阅读,希望对大家有所帮助!想了解更多相关信息请持续关注我们应届毕业生培训网!NO.10《魔兽争霸》电影版在前些时候举办的暴雪嘉年华上,暴雪公司的首席执行官和暴雪的创意开发部副总裁一起和传奇...
-
家居中的小细节
居家生活保健还有许多需要注意的地方,家里的一些小细节很多人都不甚在意。下面是本站小编整理的家居中的小细节相关内容,希望对你有帮助!一、给自己选个好的'窗帘睡个好觉是否选对了一个合适的窗帘与我们能否睡个好觉有很大关系。我们在睡眠的时候眼睛还是能够...