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标签在页面中的位置探讨
Apr 11 Javascript
你必须知道的Javascript知识点之"this指针"的应用
Apr 23 Javascript
含有CKEditor的表单如何提交
Jan 09 Javascript
jquery实现的简单二级菜单效果代码
Sep 22 Javascript
jQuery遍历DOM元素与节点方法详解
Apr 14 Javascript
浅谈jquery中使用canvas的问题
Oct 10 Javascript
jQuery EasyUI tree 使用拖拽时遇到的错误小结
Oct 10 Javascript
Vue 2.5.2下axios + express 本地请求404的解决方法
Feb 21 Javascript
详解给Vue2路由导航钩子和axios拦截器做个封装
Apr 10 Javascript
JavaScript继承定义与用法实践分析
May 28 Javascript
关于ligerui子页面关闭后,父页面刷新,重新加载的方法
Sep 27 Javascript
vue中父子组件的参数传递和应用示例
Jan 04 Vue.js
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&java(二)
2006/10/09 PHP
php调用mysql存储过程实例分析
2014/12/29 PHP
用php守护另一个php进程的例子
2015/02/13 PHP
php使用curl并发减少后端访问时间的方法分析
2016/05/12 PHP
php图片上传类 附调用方法
2016/05/15 PHP
PHP递归实现文件夹的复制、删除、查看大小操作示例
2017/08/11 PHP
IE之动态添加DOM节点触发window.resize事件
2010/07/27 Javascript
jQuery弹出(alert)select选择的值
2013/04/21 Javascript
JS动态创建Table,Tr,Td并赋值的具体实现
2013/07/05 Javascript
各浏览器对document.getElementById等方法的实现差异解析
2013/12/05 Javascript
jquery ajax双击div可直接修改div中的内容
2016/03/04 Javascript
JavaScript常用代码书写规范的超全面总结
2016/09/11 Javascript
深入理解JS实现快速排序和去重
2016/10/17 Javascript
动态加载、移除js/css文件的示例代码
2018/03/20 Javascript
jQuery 点击获取验证码按钮及倒计时功能
2018/09/20 jQuery
[26:21]浴火之凤-TI4世界冠军Newbee战队纪录片
2014/08/07 DOTA
python海龟绘图实例教程
2014/07/24 Python
python实现实时监控文件的方法
2016/08/26 Python
Python 2.x如何设置命令执行的超时时间实例
2017/10/19 Python
详解Python nose单元测试框架的安装与使用
2017/12/20 Python
python中ASCII码和字符的转换方法
2018/07/09 Python
Python给图像添加噪声具体操作
2019/03/03 Python
Django Admin中增加导出Excel功能过程解析
2019/09/04 Python
django中related_name的用法说明
2020/05/20 Python
德国综合购物网站:OTTO
2018/11/13 全球购物
写给女生的道歉信
2014/01/14 职场文书
化工工艺设计求职信
2014/06/25 职场文书
关于清明节的演讲稿
2014/09/13 职场文书
中学生运动会通讯稿大全
2014/09/18 职场文书
初中教师个人总结
2015/02/10 职场文书
2015年119消防宣传日活动总结
2015/03/24 职场文书
参加招聘会后的感想
2015/08/10 职场文书
如何在向量化NumPy数组上进行移动窗口
2021/05/18 Python
Python基础之变量的相关知识总结
2021/06/23 Python
oracle索引总结
2021/09/25 Oracle
十大公认最好看的动漫:《咒术回战》在榜,《钢之炼金术师》第一
2022/03/18 日漫