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与iframe的那些事儿
Jul 04 Javascript
Javascript中的apply()方法浅析
Mar 15 Javascript
浅析jQuery Mobile的初始化事件
Dec 03 Javascript
ECHO.js 纯javascript轻量级延迟加载的实例代码
May 24 Javascript
深入浅析JavaScript中的scrollTop
Jul 11 Javascript
JS实现图片延迟加载并淡入淡出效果的简单方法
Aug 25 Javascript
jQuery ajaxForm()的应用
Oct 14 Javascript
AngularJS ui-router (嵌套路由)实例
Mar 10 Javascript
gulp教程_从入门到项目中快速上手使用方法
Sep 14 Javascript
微信小程序wx:for循环的实例详解
Oct 07 Javascript
JavaScript模板引擎原理与用法详解
Dec 24 Javascript
一篇文章带你使用Typescript封装一个Vue组件(简单易懂)
Jun 05 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实现window平台的checkdnsrr函数
2015/05/27 PHP
php源码分析之DZX1.5随机数函数random用法
2015/06/17 PHP
Zend Framework教程之模型Model基本规则和使用方法
2016/03/04 PHP
Yii视图CGridView列表用法实例分析
2016/07/12 PHP
php无限级分类实现评论及回复功能
2019/02/18 PHP
由prototype_1.3.1进入javascript殿堂-类的初探
2006/11/06 Javascript
基于jquery的划词搜索实现(备忘)
2010/09/14 Javascript
在网站上应该用的30个jQuery插件整理
2011/11/03 Javascript
raphael.js绘制中国地图 地图绘制方法
2014/02/12 Javascript
Node.js模块加载详解
2014/08/16 Javascript
JavaScript删除指定子元素代码实例
2015/01/13 Javascript
微信jssdk在iframe页面失效问题的解决措施
2016/03/03 Javascript
解决jQuery ajax请求在IE6中莫名中断的问题
2016/06/20 Javascript
Js得到radiobuttonlist选中值的两种方法(推荐)
2016/08/25 Javascript
MUI 实现侧滑菜单及其主体部分上下滑动的方法
2018/01/25 Javascript
详解关于vue2.0工程发布上线操作步骤
2018/09/27 Javascript
微信小程序实现图片滚动效果示例
2018/12/05 Javascript
使用ThinkJs搭建微信中控服务的实现方法
2019/08/08 Javascript
使用vscode快速建立vue模板过程详解
2019/10/10 Javascript
js实现带搜索功能的下拉框
2020/01/11 Javascript
[03:05]DOTA2英雄基础教程 嗜血狂魔
2013/12/10 DOTA
Python OpenCV获取视频的方法
2018/02/28 Python
python机器学习之神经网络实现
2018/10/13 Python
Python基本类型的连接组合和互相转换方式(13种)
2019/12/16 Python
在Tensorflow中查看权重的实现
2020/01/24 Python
python实现字符串和数字拼接
2020/03/02 Python
计算机网络毕业生自荐信
2013/10/01 职场文书
学期研究性学习个人的自我评价
2014/01/09 职场文书
班级学习雷锋活动总结
2014/07/04 职场文书
机关作风建设剖析材料
2014/10/11 职场文书
大二学年个人总结
2015/03/03 职场文书
人工作失职检讨书
2015/05/05 职场文书
Html5大屏数据可视化开发的实现
2021/06/11 HTML / CSS
MySQL系列之十二 备份与恢复
2021/07/02 MySQL
css实现两栏布局,左侧固定宽,右侧自适应的多种方法
2021/08/07 HTML / CSS
Spring Boot 使用 Spring-Retry 进行重试框架
2022/04/24 Java/Android