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代码
Dec 01 Javascript
javascript offsetX与layerX区别
Mar 12 Javascript
div拖拽插件——JQ.MoveBox.js(自制JQ插件)
May 17 Javascript
js如何实现淡入淡出效果
Nov 18 Javascript
总结Javascript中数组各种去重的方法
Oct 04 Javascript
jQuery 出现Cannot read property ‘msie’ of undefined错误的解决方法
Nov 23 Javascript
JS实现重新加载当前页面或者父页面的几种方法
Nov 30 Javascript
AngularJS Controller作用域
Jan 09 Javascript
jQuery图片瀑布流的简单实现代码
Mar 15 Javascript
JS随机排序数组实现方法分析
Oct 11 Javascript
Webpack打包字体font-awesome的方法示例
Apr 26 Javascript
vue-model实现简易计算器
Aug 17 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
ionCube 一款类似zend的PHP加密/解密工具
2010/07/25 PHP
PHP 第一节 php简介
2012/04/28 PHP
jquery 选择器部分整理
2009/10/28 Javascript
使用jquery mobile做幻灯播放效果实现步骤
2013/01/04 Javascript
Jquery实现侧边栏跟随滚动条固定(兼容IE6)
2014/04/02 Javascript
Jquery跳到页面指定位置的方法
2014/05/12 Javascript
javascript操纵OGNL标签示例代码
2014/06/16 Javascript
在JS数组特定索引处指定位置插入元素的技巧
2014/08/24 Javascript
JS跨域问题详解
2014/11/25 Javascript
ztree获取当前选中节点子节点id集合的方法
2015/02/12 Javascript
JavaScript数据类型学习笔记
2016/01/25 Javascript
js判断上传文件后缀名是否合法
2016/01/28 Javascript
第一次动手实现bootstrap table分页效果
2016/09/22 Javascript
php简单数据库操作类的封装
2017/06/08 Javascript
js的函数的按值传递参数(实例讲解)
2017/11/16 Javascript
JavaScript实现仿Clock ISO时钟
2018/06/29 Javascript
微信小程序实现自动定位功能
2018/10/31 Javascript
js中的闭包实例展示
2018/11/01 Javascript
JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法完整实例
2018/12/14 Javascript
JavaScript实现简易聊天对话框(加滚动条)
2020/02/10 Javascript
Element-ui el-tree新增和删除节点后如何刷新tree的实例
2020/08/31 Javascript
js实现炫酷光感效果
2020/09/05 Javascript
详解Python中for循环是如何工作的
2017/06/30 Python
浅谈Python peewee 使用经验
2017/10/20 Python
Python+Pandas 获取数据库并加入DataFrame的实例
2018/07/25 Python
Python-while 计算100以内奇数和的方法
2019/06/11 Python
Python split() 函数拆分字符串将字符串转化为列的方法
2019/07/16 Python
如何使用python操作vmware
2019/07/27 Python
突袭HTML5之Javascript API扩展2—地理信息服务及地理位置API学习
2013/01/31 HTML / CSS
详解html5 canvas常用api总结(二)--绘图API
2016/12/14 HTML / CSS
校园学雷锋活动月总结
2014/03/09 职场文书
三方合作协议书范本
2014/04/18 职场文书
党组织领导班子整改方案
2014/10/25 职场文书
2016大学自主招生推荐信范文
2015/03/23 职场文书
证劵公司反洗钱宣传活动总结
2015/05/08 职场文书
Java如何实现树的同构?
2021/06/22 Java/Android