JavaScript ES6中CLASS的使用详解


Posted in Javascript onNovember 22, 2016

前言

对于javascript来说,类是一种可选(而不是必须)的设计模式,而且在JavaScript这样的[[Prototype]] 语言中实现类是很蹩脚的。

这种蹩脚的感觉不只是来源于语法,虽然语法是很重要的原因。js里面有许多语法的缺点:繁琐杂乱的.prototype 引用、试图调用原型链上层同名函数时的显式伪多态以及不可靠、不美观而且容易被误解成“构造函数”的.constructor。

除此之外,类设计其实还存在更进一步的问题。传统面向类的语言中父类和子类、子类和实例之间其实是复制操作,但是在[[Prototype]] 中并没有复制。

对象关联代码和行为委托使用了[[Prototype]] 而不是将它藏起来,对比其简洁性可以看出,类并不适用于JavaScript。

ES6中CLASS的使用

javascript传统做法是当生成一个对象实例,需要定义构造函数,然后通过new的方式完成。

function StdInfo(){
  this.name = "job";      
  this.age = 30;      
}

StdInfo.prototype.getNames = function (){
  console.log("name:"+this.name);        
}
//得到一个学员信息对象
var p = new StdInfo()

javacript中只有对象,没有类。它是是基于原型的语言,原型对象是新对象的模板,它将自身的属性共享给新对象。这样的写法和传统面向对象语言差异很大,很容易让新手感到困惑。

定义类

到了ES6添加了类,作为对象的模板。通过class来定义一个类:

//定义类
class StdInfo {
  constructor(){
    this.name = "job";      
    this.age = 30;   
  }
  //定义在类中的方法不需要添加function
  getNames(){
    console.log("name:"+this.name);   
  }
}
//使用new的方式得到一个实例对象
var p = new StdInfo();

上面的写法更加清晰、更像面向对象编程的语法,看起来也更容易理解。

定义的类只是语法糖,目的是让我们用更简洁明了的语法创建对象及处理相关的继承。

//定义类
class StdInfo {
  //...
}
console.log(typeof StdInfo); //function

console.log(StdInfo === StdInfo.prototype.constructor); //true

从上面的测试中可以看出来,类的类型就是一个函数,是一个“特殊函数”,指向的是构造函数。

函数的定义方式有函数声明和函数表达式两种,类的定义方式也有两种,分别是:类声明和类表达式。

类声明

类声明是定义类的一种方式,使用关键字class,后面跟上类名,然后就是一对大括号。把这一类需要定义的方法放在大括号中。

//定义类,可以省略constructor
class StdInfo {
  getNames(){
    console.log("name:"+this.name);
  }
}
// -------------------------------------
//定义类,加上constructor
class StdInfo {
  //使用new定义实例对象时,自动调用这个函数,传入参数
  constructor(name,age){
    this.name = name;      
    this.age = age;   
  }
  
  getNames(){
    console.log("name:"+this.name);   
  }
}
//定义实例对象时,传入参数
var p = new StdInfo("job",30)

constructor是一个默认方法,使用new来定义实例对象时,自动执行constructor函数,传入所需要的参数,执行完constructor后自动返回实例对象。

一个类中只能有一个constructor函数,定义多个会报错。

constructor中的this指向新创建的实例对象,利用this往新创建的实例对象扩展属性。

在定义实例对象时,不需要在初始化阶段做一些事,可以不用显示的写constructor函数。如果没有显式定义,一个空的constructor方法会被默认添加,constructor(){}

类表达式

类表达式是定义类的另一种形式,类似于函数表达式,把一个函数作为值赋给变量。可以把定义的类赋值给一个变量,这时候变量就为类名。class关键字之后的类名可有可无,如果存在,则只能在类内部使用。

定义类 class后面有类名:

const People = class StdInfo {
  constructor(){
    console.log(StdInfo); //可以打印出值,是一个函数
  }
}

new People();
new StdInfo(); //报错,StdInfo is not defined;

定义类 class后面没有类名:

const People = class {
  constructor(){

  }
}

new People();

立即执行的类:

const p = new class {
  constructor(name,age){
    console.log(name,age);
  }
}("job",30)

立即执行的类,在类前要加上new。p为类的实例对象。

不存在变量提升

定义类不存在变量提升,只能先定义类后使用,跟函数声明有区别的。

//-----函数声明-------
//定义前可以先使用,因为函数声明提升的缘故,调用合法。
func();
function func(){}

//-----定义类---------------
new StdInfo(); //报错,StdInfo is not defined
class StdInfo{}

EXTENDS继承

使用extends关键字实现类之间的继承。这比在ES5中使用继承要方便很多。

//定义类父类
class Parent {
  constructor(name,age){
    this.name = name;
    this.age = age;
  }

  speakSometing(){
    console.log("I can speek chinese");
  }
}
//定义子类,继承父类
class Child extends Parent {
  coding(){
    console.log("coding javascript");
  }
}

var c = new Child();

//可以调用父类的方法
c.speakSometing(); // I can speek chinese

使用继承的方式,子类就拥有了父类的方法。

如果子类中有constructor构造函数,则必须使用调用super。

//定义类父类
class Parent {
  constructor(name,age){
    this.name = name;
    this.age = age;
  }

  speakSometing(){
    console.log("I can speek chinese");
  }
}
//定义子类,继承父类
class Child extends Parent {
  constructor(name,age){
    //不调super(),则会报错 this is not defined

    //必须调用super
    super(name,age);
  }

  coding(){
    console.log("coding javascript");
  }
}

var c = new Child("job",30);

//可以调用父类的方法
c.speakSometing(); // I can speek chinese

子类必须在constructor方法中调用super方法,否则新建实例时会报错(this is not defined)。这是因为子类没有自己的this对象,而是继承父类的this对象,然后对其进行加工。如果不调用super方法,子类就得不到this对象。

总结

好了,以上就是对ES6中类的简单总结学习,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
关于js中window.location.href,location.href,parent.location.href,top.location.href的用法与区别
Oct 18 Javascript
multiSteps 基于Jquery的多步骤滑动切换插件
Jul 22 Javascript
JQuery控制div外点击隐藏而div内点击不会隐藏的方法
Jan 13 Javascript
常用jQuery代码分享
Jul 14 Javascript
jquery SweetAlert插件实现响应式提示框
Aug 18 Javascript
jQuery选择器总结之常用元素查找方法
Aug 04 Javascript
javascript 组合按键事件监听实现代码
Feb 21 Javascript
JS实现的简单表单验证功能完整实例
Oct 14 Javascript
react以create-react-app为基础创建项目
Mar 14 Javascript
Koa项目搭建过程详细记录
Apr 12 Javascript
vue 项目 iOS WKWebView 加载
Apr 17 Javascript
element form 校验数组每一项实例代码
Oct 10 Javascript
AngularJS实现ajax请求的方法
Nov 22 #Javascript
js数组操作方法总结(必看篇)
Nov 22 #Javascript
jQ处理xml文件和xml字符串的方法(详解)
Nov 22 #Javascript
js字符串操作总结(必看篇)
Nov 22 #Javascript
JavaScript的兼容性与调试技巧
Nov 22 #Javascript
关于Iframe父页面与子页面之间的相互调用
Nov 22 #Javascript
JS中BOM相关知识点总结(必看篇)
Nov 22 #Javascript
You might like
php中$this->含义分析
2009/11/29 PHP
linux下使用ThinkPHP需要注意大小写导致的问题
2011/08/02 PHP
Session保存到数据库的php类分享
2011/10/24 PHP
ThinkPHP模板范围判断输出In标签与Range标签用法详解
2014/06/30 PHP
Laravel 中创建 Zip 压缩文件并提供下载的实现方法
2019/04/02 PHP
JS 用6N±1法求素数 实例教程
2009/10/20 Javascript
jquery实现图片等比例缩放以及max-width在ie中不兼容解决
2013/03/21 Javascript
jQuery下实现等待指定元素加载完毕(可改成纯js版)
2013/07/11 Javascript
浏览器兼容console对象的简要解决方案分享
2013/10/24 Javascript
探讨js中的双感叹号判断
2013/11/11 Javascript
jQuery多级手风琴菜单实例讲解
2015/10/22 Javascript
JavaScript中三个等号和两个等号的区别(== 和 ===)浅析
2016/09/22 Javascript
详解如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件
2017/06/01 jQuery
原生JS+Canvas实现五子棋游戏
2020/05/28 Javascript
详解Node.js 中使用 ECDSA 签名遇到的坑
2018/11/26 Javascript
vue打包之后生成一个配置文件修改接口的方法
2018/12/09 Javascript
详解NodeJS Https HSM双向认证实现
2019/03/12 NodeJs
利用Bootstrap Multiselect实现下拉框多选功能
2019/04/08 Javascript
解决layui调用自定义方法提示未定义的问题
2019/09/14 Javascript
[06:33]3.19 DOTA2发布会 海涛、冷冷、2009见证希望
2014/03/21 DOTA
[01:04:01]2014 DOTA2华西杯精英邀请赛5 24 DK VS VG
2014/05/25 DOTA
python网络编程学习笔记(五):socket的一些补充
2014/06/09 Python
python字符串排序方法
2014/08/29 Python
解决Python 遍历字典时删除元素报异常的问题
2016/09/11 Python
深入理解Python异常处理的哲学
2019/02/01 Python
Django REST Framework序列化外键获取外键的值方法
2019/07/26 Python
opencv导入头文件时报错#include的解决方法
2019/07/31 Python
如何基于pandas读取csv后合并两个股票
2020/09/25 Python
美国第一香水网站:Perfume.com
2017/01/23 全球购物
Lookfantastic德国官网:英国知名美妆购物网站
2017/06/11 全球购物
小学生新学期寄语
2014/01/19 职场文书
《莫高窟》教学反思
2014/02/25 职场文书
2015年公民道德宣传日活动总结
2015/03/23 职场文书
护士岗位竞聘书
2015/09/15 职场文书
php+laravel 扫码二维码签到功能
2021/05/15 PHP
python装饰器代码解析
2022/03/23 Python