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面向对象设计一 工厂模式
Dec 20 Javascript
根据邮箱的域名跳转到相应的登录页面的代码
Feb 27 Javascript
浅析JavaScript中的CSS属性及命名规范
Nov 28 Javascript
JavaScript使用setInterval()函数实现简单轮询操作的方法
Feb 02 Javascript
Vue.js开发环境搭建
Nov 10 Javascript
BootStrap表单验证 FormValidation 调整反馈图标位置的实例代码
May 17 Javascript
vue2.0 + ele的循环表单及验证字段方法
Sep 18 Javascript
详解vue 在移动端体验上的优化解决方案
May 20 Javascript
js字符串类型String常用操作实例总结
Jul 05 Javascript
vue 组件中使用 transition 和 transition-group实现过渡动画
Jul 09 Javascript
解决vue-cli webpack打包开启Gzip 报错问题
Jul 24 Javascript
JS删除对象中某一属性案例详解
Sep 08 Javascript
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+SQL 注入攻击的技术实现以及预防办法
2010/12/29 PHP
WordPress中对访客评论功能的一些优化方法
2015/11/24 PHP
大家须知简单的php性能优化注意点
2016/01/04 PHP
php+mysql+ajax实现单表多字段多关键词查询的方法
2017/04/15 PHP
Javascript 网页水印(非图片水印)实现代码
2010/03/01 Javascript
jQuery 1.5.1 发布,全面支持IE9 修复大量bug
2011/02/26 Javascript
js日期、星座的级联显示代码
2014/01/23 Javascript
对之前写的jquery分页做下升级
2014/06/19 Javascript
JQuery $.each遍历JavaScript数组对象实例
2014/09/01 Javascript
点击A元素触发B元素的事件在IE8下会识别成A元素
2014/09/04 Javascript
js控制网页背景音乐播放与停止的方法
2015/02/06 Javascript
JS烟花背景效果实现方法
2015/03/03 Javascript
jQuery插件bxSlider实现响应式焦点图
2015/04/12 Javascript
js实现非常简单的焦点图切换特效实例
2015/05/07 Javascript
jQuery往textarea中光标所在位置插入文本的方法
2015/06/26 Javascript
jQuery实现带延迟的二级tab切换下拉列表效果
2015/09/01 Javascript
Vue.js使用$.ajax和vue-resource实现OAuth的注册、登录、注销和API调用
2017/05/10 Javascript
基于Vue生产环境部署详解
2017/09/15 Javascript
详解使用Next.js构建服务端渲染应用
2018/07/10 Javascript
vue请求数据的三种方式
2020/03/04 Javascript
Python 抓取动态网页内容方案详解
2014/12/25 Python
python实现超简单端口转发的方法
2015/03/13 Python
python实现颜色rgb和hex相互转换的函数
2015/03/19 Python
Python的ORM框架中SQLAlchemy库的查询操作的教程
2015/04/25 Python
python实现的DES加密算法和3DES加密算法实例
2015/06/03 Python
Python快速排序算法实例分析
2017/11/29 Python
Python 利用pydub库操作音频文件的方法
2019/01/09 Python
CSS3的Border-radius轻松制作圆角
2012/12/24 HTML / CSS
css3的focus-within选择器的使用
2020/05/11 HTML / CSS
Fairyseason:为个人和批发商提供女装和配件
2017/03/01 全球购物
英国演唱会订票网站:Ticket Selection
2018/03/27 全球购物
华为c/c++笔试题
2016/01/25 面试题
高中学生评语大全
2014/04/25 职场文书
三好学生个人总结
2015/02/15 职场文书
教师求职信怎么写
2015/03/20 职场文书
利用uni-app生成微信小程序的踩坑记录
2022/04/05 Javascript