javascript每日必学之继承


Posted in Javascript onFebruary 23, 2016

朋友们大家好,我们今天这一讲就接着前面的封装继续讲解,今天就是在前面内容上面的升级,OOP思想中的继承,我们就先来解释一下继承到底是什么意思,我们在什么地方会用到继续。

继承就是,后代继续祖先的一系列属性,行为。后代仍然算是与祖先同族,下面我们再用一些具体描述,来理解一下什么是继承

javascript每日必学之继承

中国人,跟美国人都是 继承自 人类祖先,所以我们具有相同的属性行为,但是还有一定的差异,后面我们们将继续讲到的多态,所以通过上面的示例图,我们可以清晰的知道,人与人之前其实大同小异,所以我们再看看下面的示例代码,我们就知道,用代码来模拟继承,我们就又可以知道一种方法来写尽量少的代码达到做尽量多的事。

//遗传继承函数
function Extend(Children,Parent){
  //这里仅仅只是继承的原型链接定义的行为
  for(var p in Parent.prototype){
    Children[p] = Parent.prototype[p];
  }
}
//人类祖先
function Human(){
  this.weight = "50kg";
  this.height = "180cm";
  this.hair = "棕色";
}
//吃饭
Human.prototype.Eat = function(){
  console.log("吃饭");
}
//说话
Human.prototype.Say = function(){
  console.log("大家好我是地球人");
}
//行走
Human.prototype.Walk = function(){
  console.log("我是人类,天生就可以两条腿直立行走");
}
//繁衍
Human.prototype.Multiply = function(){
  console.log("跟老婆一起做羞羞的事,就是为了人类的繁荣");
}

//中国人
function Chinese(){
  //调用继承函数
  Extend(this,Human);
}
//美国人
function American(){
  //调用继承函数
  Extend(this,Human);
}

我们就这样写,就模拟了高级语言中的继承,下面我们看看运行后,有没有问题

javascript每日必学之继承

运行后,我们发现了问题,这样写,我们已经可以实现原型链接的继承了,而且也大大的节省了很多代码,我们在写Chinese和American函数的时候,是不是只写了少量代码,我们就把父类行为给继承过来了,而实例也能调用父类所拥有的行为函数,但是这样写,我们还没有完全实现继承,因为我们在调用hair属性的时候就根本没有起到作用,那么,我们再修改一下代码,就可以实现完全继承了

//遗传继承函数
function Extend(Children,Parent){
  //现在我们是从父类实例来继承,所以属性和方法都会被继承的
  for(var p in Parent){
    if(typeof Children[p] == "undefined"){
      Children[p] = Parent[p];
    }
  }
}
//人类祖先
function Human(){
  this.weight = "50kg";
  this.height = "180cm";
  this.hair = "棕色";
}
//吃饭
Human.prototype.Eat = function(){
  console.log("吃饭");
}
//说话
Human.prototype.Say = function(){
  console.log("大家好我是地球人");
}
//行走
Human.prototype.Walk = function(){
  console.log("我是人类,天生就可以两条腿直立行走");
}
//繁衍
Human.prototype.Multiply = function(){
  console.log("跟老婆一起做羞羞的事,就是为了人类的繁荣");
}
//中国人
function Chinese(){
  //调用继承函数
  Extend(this,new Human());
}
//美国人
function American(){
  //调用继承函数
  Extend(this,new Human());
}

我们还是要看一下运行的效果是不是跟我们想象中的一样?

javascript每日必学之继承

通过上在的代码我们不难看出,现在的继承函数实际上是从Human类的具体实例中复制的属性及行为,这样我们就更进一步模拟出了类的继承,在上面有一句,我还需要给大家解释一下

if(typeof Children[p] == "undefined"){
 ...... 
}

这里出现的typeof关键字其实是一个运算符,是查看某个变量是什么类型,如果是未定义的情况,运算出的结果就是 "undefined" ,所以我就是这样比较,如果子类没有定义过这样的属性或者行为函数,那么就从父类继承(注:这里的解释是为了后面的多态作铺垫)。

接下来我们再来看一下可不可以多重继承,前面我们已经提到Chinese与American两个类都是继承自Human类,下面我们再写一个类来继承自Chinese

//四川人
function SiChuanMan(){
  Extend(this,new Chinese());
}

javascript每日必学之继承

现在我们已经写出很健壮的继承代码,理解也非常的简单,只要在声明新类的时候,在构造函数里面调用一下继承函数,我们就可以实现属性及行为函数的完全继承,这样,我们就可以省下大量的代码,OOP思想的优势再一次地被体现了出来,如果我们要模拟中国每个省份的人,如果我每个省份都照着Human类的方式去写,从太阳出来写到第二天的太阳落坡都写不完。继承的写法多种多样,每个人都有自己的写法,这里,我就是以一种最简单的方式给大家讲解的,到后面大家能熟练使用时候,也可以以自己喜欢的方式去写,javascript本身就是一门很灵活的语言。

总结一下,我们今天在封装基础上进一步做了升级,这样我们就实现了对象的继承,书写的代码量被进一步被压缩,想想能提高工作的效率,更能提高代码的优雅度,是不是有一点的小激动呢,只要跟着我脚步走,我们就可以用最简单的方式去理解最复杂的东西,其实程序并不复杂,复杂的原因是大家没有得到正确的带领,本来很简单的一个东西,被不同的人理解及解释成不同的东西,这样学习起来就复杂了,更多的是没有连续的教程一步一步地带领大家向正确的方向迈进,所以很长时间都很难得到提升。

Javascript 相关文章推荐
JavaScript中的集合及效率
Jan 08 Javascript
JS字符串函数扩展代码
Sep 13 Javascript
兼容Firefox的Javascript XSLT 处理XML文件
Dec 31 Javascript
js中split和replace的用法实例
Feb 28 Javascript
jQuery源码分析之Callbacks详解
Mar 13 Javascript
JavaScript获取一个范围内日期的方法
Apr 24 Javascript
[原创]JavaScript语法高亮插件highlight.js用法详解【附highlight.js本站下载】
Nov 01 Javascript
jquery点赞功能实现代码 点个赞吧!
May 29 jQuery
vue 中自定义指令改变data中的值
Jun 02 Javascript
javascript数据类型中的一些小知识点(推荐)
Apr 18 Javascript
vue实现登录、注册、退出、跳转等功能
Dec 23 Vue.js
基于vue+echarts数据可视化大屏展示的实现
Dec 25 Vue.js
JS实现的仿QQ空间图片弹出效果代码
Feb 23 #Javascript
理解javascript封装
Feb 23 #Javascript
学习Javascript面向对象编程之封装
Feb 23 #Javascript
javascript每日必学之封装
Feb 23 #Javascript
jQuery常用知识点总结以及平时封装常用函数
Feb 23 #Javascript
使用Javascript实现选择下拉菜单互移并排序
Feb 23 #Javascript
jQuery拖拽排序插件制作拖拽排序效果(附源码下载)
Feb 23 #Javascript
You might like
PHP 开发环境配置(Zend Server安装)
2010/04/28 PHP
PHP使用PHPExcel实现批量上传到数据库的方法
2017/06/08 PHP
PHP实现的多维数组排序算法分析
2018/02/10 PHP
jquery动画4.升级版遮罩效果的图片走廊--带自动运行效果
2012/08/24 Javascript
扩展js对象数组的OrderByAsc和OrderByDesc方法实现思路
2013/05/17 Javascript
使用js实现一个可编辑的select下拉列表
2014/02/20 Javascript
JavaScript中的toUTCString()方法使用详解
2015/06/12 Javascript
js模拟淘宝网的多级选择菜单实现方法
2015/08/18 Javascript
jQuery插件pagination实现无刷新分页
2016/05/21 Javascript
confirm确认对话框的实现方法总结
2016/06/17 Javascript
Bootstrap CSS使用方法
2016/12/23 Javascript
JS优化与惰性载入函数实例分析
2017/04/06 Javascript
Three.js入门之hello world以及如何绘制线
2017/09/25 Javascript
Vue 换肤的示例实践
2018/01/23 Javascript
使用淘宝镜像cnpm安装Vue.js的图文教程
2018/05/17 Javascript
JS实现的雪花飘落特效示例
2019/12/03 Javascript
js实现限定范围拖拽的示例
2020/10/26 Javascript
[47:55]Ti4第二日主赛事败者组 NaVi vs EG 1
2014/07/20 DOTA
[02:14]完美“圣”典2016风云人物:xiao8专访
2016/12/01 DOTA
python opencv摄像头的简单应用
2019/06/06 Python
Win10系统下安装labelme及json文件批量转化方法
2019/07/30 Python
python join方法使用详解
2019/07/30 Python
利用python实现逐步回归
2020/02/24 Python
如何使用pycharm连接Databricks的步骤详解
2020/09/23 Python
利用CSS3实现自定义滚动条代码分享
2016/08/18 HTML / CSS
what is the difference between ext2 and ext3
2013/11/03 面试题
中科软测试工程师面试题
2012/06/16 面试题
护理专业优质毕业生自荐书
2014/01/31 职场文书
高中物理教学反思
2014/02/08 职场文书
我的祖国演讲稿
2014/05/04 职场文书
大学竞选班干部演讲稿
2014/08/21 职场文书
2014年防汛工作总结
2014/12/08 职场文书
保险公司客户经理岗位职责
2015/04/09 职场文书
2015年医院创卫工作总结
2015/04/22 职场文书
中学总务处工作总结
2015/08/12 职场文书
MySQL 开窗函数
2022/02/15 MySQL