JavaScript之class继承_动力节点Java学院整理


Posted in Javascript onJuly 03, 2017

JavaScript的对象模型是基于原型实现的,特点是简单,缺点是理解起来比传统的类-实例模型要困难,最大的缺点是继承的实现需要编写大量代码,并且需要正确实现原型链。

有没有更简单的写法?有!

新的关键字class从ES6开始正式被引入到JavaScript中。class的目的就是让定义类更简单。

我们先回顾用函数实现Student的方法:

function Student(name) {
  this.name = name;
}

Student.prototype.hello = function () {
  alert('Hello, ' + this.name + '!');
}

如果用新的class关键字来编写Student,可以这样写:

class Student {
  constructor(name) {
    this.name = name;
  }

  hello() {
    alert('Hello, ' + this.name + '!');
  }
}

比较一下就可以发现,class的定义包含了构造函数constructor和定义在原型对象上的函数hello()(注意没有function关键字),这样就避免了Student.prototype.hello = function () {...}这样分散的代码。

最后,创建一个Student对象代码和前面章节完全一样:

var xiaoming = new Student('小明');
xiaoming.hello();

class继承

用class定义对象的另一个巨大的好处是继承更方便了。想一想我们从Student派生一个PrimaryStudent需要编写的代码量。现在,原型继承的中间对象,原型对象的构造函数等等都不需要考虑了,直接通过extends来实现:

class PrimaryStudent extends Student {
  constructor(name, grade) {
    super(name); // 记得用super调用父类的构造方法!
    this.grade = grade;
  }

  myGrade() {
    alert('I am at grade ' + this.grade);
  }
}

注意PrimaryStudent的定义也是class关键字实现的,而extends则表示原型链对象来自Student。子类的构造函数可能会与父类不太相同,例如,PrimaryStudent需要namegrade两个参数,并且需要通过super(name)来调用父类的构造函数,否则父类的name属性无法正常初始化。

PrimaryStudent已经自动获得了父类Studenthello方法,我们又在子类中定义了新的myGrade方法。

ES6引入的class和原有的JavaScript原型继承有什么区别呢?实际上它们没有任何区别,class的作用就是让JavaScript引擎去实现原来需要我们自己编写的原型链代码。简而言之,用class的好处就是极大地简化了原型链代码。

你一定会问,class这么好用,能不能现在就用上?

现在用还早了点,因为不是所有的主流浏览器都支持ES6的class。如果一定要现在就用上,就需要一个工具把class代码转换为传统的prototype代码,可以试试Babel这个工具。

练习

请利用class重新定义Cat,并让它从已有的Animal继承,然后新增一个方法say(),返回字符串 'Hello, xxx!'

Javascript 相关文章推荐
javascript实现文字图片上下滚动的具体实例
Jun 28 Javascript
jquery定时滑出可最小化的底部提示层特效代码
Oct 02 Javascript
javascript中的undefined和not defined区别示例介绍
Feb 26 Javascript
js实现页面跳转重定向的几种方式
May 29 Javascript
jQuery中prevAll()方法用法实例
Jan 08 Javascript
有关Promises异步问题详解
Nov 13 Javascript
jQuery AjaxUpload 上传图片代码
Feb 02 Javascript
关于Vue单页面骨架屏实践记录
Dec 13 Javascript
JavaScript动态创建二维数组的方法示例
Feb 01 Javascript
微信小程序如何引用外部js,外部样式,公共页面模板
Jul 23 Javascript
Elasticsearch实现复合查询高亮结果功能
Sep 10 Javascript
如何解决日期函数new Date()浏览器兼容性问题
Sep 11 Javascript
JavaScript之浏览器对象_动力节点Java学院整理
Jul 03 #Javascript
JavaScript之underscore_动力节点Java学院整理
Jul 03 #Javascript
React组件生命周期详解
Jul 03 #Javascript
利用Vue.js实现求职在线之职位查询功能
Jul 03 #Javascript
Swiper实现轮播图效果
Jul 03 #Javascript
jQuery实现点击关注和取消功能
Jul 03 #jQuery
Vue.js基础指令实例讲解(各种数据绑定、表单渲染大总结)
Jul 03 #Javascript
You might like
隐性调用php程序的方法
2009/03/09 PHP
PHP字符串 ==比较运算符的副作用
2009/10/21 PHP
php判断访问IP的方法
2015/06/19 PHP
PHP带节点操作的无限分类实现方法详解
2016/11/09 PHP
javascript dom 基本操作小结
2010/04/11 Javascript
Javascript 检测键盘按键信息及键码值对应介绍
2013/01/03 Javascript
js根据给定的日期计算当月有多少天实现思路及代码
2013/02/25 Javascript
JavaScript解析URL参数示例代码
2013/08/12 Javascript
图解js图片轮播效果
2015/12/20 Javascript
jQuery原理系列-常用Dom操作详解
2016/06/07 Javascript
jQuery实现获取元素索引值index的方法
2016/09/18 Javascript
炫酷的js手风琴效果
2016/10/13 Javascript
简单谈谈ES6的六个小特性
2016/11/18 Javascript
利用jquery去掉时光轴头尾部线条的方法实例
2017/06/16 jQuery
详解vue中async-await的使用误区
2018/12/05 Javascript
JS script脚本中async和defer区别详解
2020/06/24 Javascript
浅谈js中的attributes和Attribute的用法与区别
2020/07/16 Javascript
js实现类选择器和name属性选择器的示例步骤
2021/02/07 Javascript
解决python写的windows服务不能启动的问题
2014/04/15 Python
完美解决python遍历删除字典里值为空的元素报错问题
2016/09/11 Python
浅谈numpy库的常用基本操作方法
2018/01/09 Python
Pycharm2020.1安装中文语言插件的详细教程(不需要汉化)
2020/08/07 Python
Hotels.com泰国:酒店预订网站
2019/11/20 全球购物
Lookfantastic澳大利亚官网:英国知名美妆购物网站
2021/01/07 全球购物
中西医结合临床医学专业大学生自荐信
2013/09/28 职场文书
上班睡觉检讨书
2014/01/09 职场文书
《夜晚的实验》教学反思
2014/02/19 职场文书
合作经营协议书
2014/04/17 职场文书
教育系统干部作风整顿心得体会
2014/09/09 职场文书
巾帼标兵事迹材料
2014/12/26 职场文书
会议欢迎词范文
2015/01/27 职场文书
银行客户经理培训心得体会
2016/01/09 职场文书
读完《骆驼祥子》的观后感!
2019/07/05 职场文书
2019下半年英语教师的教学工作计划(3篇)
2019/09/25 职场文书
elementui的el-popover修改样式不生效的解决
2021/06/30 Javascript
SQL Server使用T-SQL语句批处理
2022/05/20 SQL Server