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 indexOf函数使用说明
Jul 03 Javascript
Javascript改变CSS样式(局部和全局)
Dec 18 Javascript
JSONP之我见
Mar 24 Javascript
javascript实现十秒钟后注册按钮可点击的方法
May 13 Javascript
Bootstrap实现水平排列的表单
Jul 04 Javascript
js 动态添加元素(div、li、img等)及设置属性的方法
Jul 19 Javascript
jQuery弹出层插件popShow用法示例
Jan 23 Javascript
JavaScript 中使用 Generator的方法
Dec 29 Javascript
Vue.js实现双向数据绑定方法(表单自动赋值、表单自动取值)
Aug 27 Javascript
浅谈JavaScript面向对象--继承
Mar 20 Javascript
微信小程序开发实现的IP地址查询功能示例
Mar 28 Javascript
vue键盘事件点击事件加native操作
Jul 27 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类
2006/11/25 PHP
php获取远程图片体积大小的实例
2013/11/12 PHP
Yii分页用法实例详解
2014/12/04 PHP
laravel入门知识点整理
2020/09/15 PHP
WordPress 照片lightbox效果的运用几点
2009/06/22 Javascript
js三种排序算法分享
2012/08/16 Javascript
jQuery bxCarousel实现图片滚动切换效果示例代码
2013/05/15 Javascript
快速查找数组中的某个元素并返回下标示例
2013/09/03 Javascript
JQuery实现倒计时按钮具体方法
2013/11/14 Javascript
JavaScript实现生成GUID(全局统一标识符)
2014/09/05 Javascript
妙用Bootstrap的 popover插件实现校验表单提示功能
2016/08/29 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(二)
2017/05/11 Javascript
jQuery UI Draggable + Sortable 结合使用(实例讲解)
2017/09/07 jQuery
NodeJs 文件系统操作模块fs使用方法详解
2018/11/26 NodeJs
微信小程序提取公用函数到util.js及使用方法示例
2019/01/10 Javascript
Vue.js组件实现选项卡以及切换特效
2019/07/24 Javascript
使用vue制作滑动标签
2019/09/21 Javascript
Jquery+javascript实现支付网页数字键盘
2020/12/21 jQuery
用PyInstaller把Python代码打包成单个独立的exe可执行文件
2018/05/26 Python
Python实现的插入排序,冒泡排序,快速排序,选择排序算法示例
2019/05/04 Python
解决Django Static内容不能加载显示的问题
2019/07/28 Python
简单了解python变量的作用域
2019/07/30 Python
Python 数据的累加与统计的示例代码
2020/08/03 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
2020/12/14 Python
比利时香水网上商店:NOTINO
2018/03/28 全球购物
Bally巴利中国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/10/09 全球购物
家乐福台湾线上购物网:Carrefour台湾
2020/09/15 全球购物
上海中网科技笔试题
2012/02/19 面试题
电子装配专业毕业生求职信
2014/04/23 职场文书
小学教师暑期培训方案
2014/08/28 职场文书
教育实践活动对照检查材料
2014/09/23 职场文书
预备党员群众路线思想汇报2014
2014/10/25 职场文书
企业整改报告范文
2014/11/08 职场文书
民事答辩状格式范文
2015/05/21 职场文书
公安干警正风肃纪心得体会
2016/01/15 职场文书
用Python编写简单的gRPC服务的详细过程
2021/07/04 Python