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 相关文章推荐
3Z版基于jquery的图片复选框(asp.net+jquery)
Apr 12 Javascript
Jquery AJAX 用于计算点击率(统计)
Jun 30 Javascript
IE8提示Invalid procedure call or argument 异常的解决方法
Sep 30 Javascript
js 文本滚动效果的实例代码
Aug 17 Javascript
HTML页面滚动时获取离页面顶部的距离2种实现方法
Sep 05 Javascript
JS动态显示表格上下frame的方法
Mar 31 Javascript
使用jquery清空、复位整个输入域
Apr 02 Javascript
值得分享的轻量级Bootstrap Table表格插件
May 30 Javascript
javascript 分号总结及详细介绍
Sep 24 Javascript
jQuery利用sort对DOM元素进行排序操作
Nov 07 Javascript
vue-cli3.0如何使用CDN区分开发、生产、预发布环境
Nov 22 Javascript
浅析 Vue 3.0 的组装式 API(一)
Aug 31 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编写的一个E-mail验证类
2015/03/25 PHP
用cookies实现的可记忆的样式切换效果代码下载
2007/12/24 Javascript
jquery图片延迟加载 前端开发技能必备系列
2012/06/18 Javascript
javascript学习笔记(十四) window对象使用介绍
2012/06/20 Javascript
JS数学函数Exp使用说明
2012/08/09 Javascript
js实现杯子倒水问题自动求解程序
2013/03/25 Javascript
JQuery在页面中添加和除移DOM示例代码
2013/06/24 Javascript
jquery文本框中的事件应用以输入邮箱为例
2014/05/06 Javascript
jquery实现鼠标滑过小图查看大图的方法
2015/07/20 Javascript
jQuery模拟完美实现经典FLASH导航动画效果【附demo源码下载】
2016/11/09 Javascript
xmlplus组件设计系列之选项卡(Tabbar)(5)
2017/05/03 Javascript
解决JSON.stringify()自动将中文转译成unicode的问题
2018/01/05 Javascript
使用vue-aplayer插件时出现的问题的解决
2018/03/02 Javascript
vue.js click点击事件获取当前元素对象的操作
2020/08/07 Javascript
JavaScript Array.flat()函数用法解析
2020/09/02 Javascript
从零学Python之入门(二)基本数据类型
2014/05/25 Python
python中assert用法实例分析
2015/04/30 Python
浅析Python的Django框架中的Memcached
2015/07/23 Python
python正则中最短匹配实现代码
2018/01/16 Python
python计算列表内各元素的个数实例
2018/06/29 Python
Pandas DataFrame 取一行数据会得到Series的方法
2018/11/10 Python
python 实现读取一个excel多个sheet表并合并的方法
2019/02/12 Python
Python脚本修改阿里云的访问控制列表的方法
2019/03/08 Python
Pytorch中accuracy和loss的计算知识点总结
2019/09/10 Python
python动态视频下载器的实现方法
2019/09/16 Python
python 画3维轨迹图并进行比较的实例
2019/12/06 Python
如何提高python 中for循环的效率
2020/04/15 Python
使用Python实现批量ping操作方法
2020/05/06 Python
Python用类实现扑克牌发牌的示例代码
2020/06/01 Python
Linux Interview Questions For software testers
2012/06/02 面试题
2014班子成员自我剖析材料思想汇报
2014/10/01 职场文书
股东出资证明书范例
2014/10/04 职场文书
前台接待岗位职责范本
2015/04/03 职场文书
2016教师节感恩话语
2015/12/09 职场文书
《鲸》教学反思
2016/02/23 职场文书
python使用openpyxl库读写Excel表格的方法(增删改查操作)
2021/05/02 Python