JavaScript设计模式学习之“类式继承”


Posted in Javascript onMarch 12, 2015

在做一件事情之前,首先要清楚做这件事情的好处有什么,相信不会有哪个人愿意无缘无故的去做事情。一般说来,我们在设计类的时候,实际上就是希望能减少重复性的代码,使用继承可以完美的做到这一点,借助继承机制,你可以在现有类的基础上再次进行设计并且充分利用它们已经具备的各种方法,而对设计的修改也更为轻松。废话不多说了,举例说明:

function Person(name){

    this.name = name;

}

Person.prototype.getname = function(){

    return this.name;

}

 

function Bloger(name,blog){

    Person.call(this,name);

    this.blog = blog;

}

var bloger = new Bloger("zhenn","https://3water.com");

alert(bloger.name=="zhenn");   /*返回ture*/

alert(bloger.blog)   /*提示https://3water.com*/

alert(bloger.getname()=="zhenn");   /*提示"bloger.getname is not a function"*/

通过上例可以看到,Bloger在其内部通过call动态调用了其父类Person的原生属性和方法(关于call的讲解请参考https://3water.com/article/62086.htm),即可以理解为Bloger继承了Person,成为它的一个子类,但是细心的同学会发现,Person原型对象中的方法,仅仅依靠call,是不能继承过来的,这也就是会提示"bloger.getname is not a function"的原因所在了。不过不用担心,对上述代码稍作处理,即可解决这个问题!

function Person(name){

    this.name = name;

}

Person.prototype.getname = function(){

    return this.name;

}

 

function Bloger(name,blog){

    Person.call(this,name);

    this.blog = blog;

}

/*请注意以下两行代码*/

Bloger.prototype = new Person();  

Bloger.prototype.constructor = Bloger;

 

var bloger = new Bloger("zhenn","https://3water.com");

alert(bloger.name=="zhenn");   /*返回ture*/

alert(bloger.blog)   /*提示https://3water.com*/

alert(bloger.getname()=="zhenn");   /*提示true*/

在这里需要对这两行代码解释一下,我们知道,每一个构造函数都有一个prototype属性,这个属性指向该构造函数的原型对象,其实原型对象也是实例对象,只不过在原型对象中定义的属性和方法可以提供给所有的实例对象共享,由此可以得出,新添加两行代码的意图就是设置子类的原型对象指向父类的一个实例化对象,而父类的实例化对象会把父类的原型属性方法统统继承过来,这样也就达到了我们的目的,子类的原型继承了所有父类实例对象具有的属性和方法。

但是还应该注意Bloger.prototype.constructor = Bloger;这行代码,因为把子类的prototype设置为父类的实例时,其constructor属性会指向父类,所以要设置子类原型的constructor重新指向子类,至此,已经完美实现了javascript的类式继承!

为了简化子类的声明,可以把扩展子类的整个过程写在一个名为extend的函数中,作用就是基于一个给定的类结构去创建一个新的类:

function extend(childClass,parentClass){

    var F = new Function();

    F.prototype = parentClass.prototype;

    childClass.prototype = new F();

    childClass.prototype.constructor = childClass;

}

有了这个extend这个函数,就可以很方便的扩展子类了,只需调用这个函数即可,上述添加的两行代码可改为extend(Bloger,Person), 一样可以实现完全继承!

Javascript 相关文章推荐
jQuery 行背景颜色的交替显示(隔行变色)实现代码
Dec 13 Javascript
jQuery中live方法的重复绑定说明
Oct 21 Javascript
jquery实现增加删除行的方法
Feb 03 Javascript
ES6学习之变量的解构赋值
Feb 12 Javascript
Bootstrap警告框(Alert)插件使用方法
Mar 21 Javascript
HTML5实现微信拍摄上传照片功能
Apr 21 Javascript
js实现方块上下左右移动效果
Aug 17 Javascript
详解vue-cli 本地开发mock数据使用方法
May 29 Javascript
微信小程序BindTap快速连续点击目标页面跳转多次问题处理
Apr 08 Javascript
vue 自动化路由实现代码
Sep 03 Javascript
jQuery实现容器间的元素拖拽功能
Dec 01 jQuery
详解JavaScript的计时器和按钮效果设置
Feb 18 Javascript
鼠标事件的screenY,pageY,clientY,layerY,offsetY属性详解
Mar 12 #Javascript
JavaScript中return false的用法
Mar 12 #Javascript
JavaScript中神奇的call()方法
Mar 12 #Javascript
jquery实现无限分级横向导航菜单的方法
Mar 12 #Javascript
JavaScript中定义函数的三种方法
Mar 12 #Javascript
javascript实时显示北京时间的方法
Mar 12 #Javascript
jquery实现焦点图片随机切换效果的方法
Mar 12 #Javascript
You might like
PHP的异常处理类Exception的使用及说明
2012/06/13 PHP
PHP基于数组实现的分页函数实例
2014/08/20 PHP
jQuery)扩展jQuery系列之一 模拟alert,confirm(一)
2010/12/04 Javascript
jquery可定制的在线UEditor编辑器
2015/11/17 Javascript
搞定immutable.js详细说明
2016/05/02 Javascript
Angular 4.X开发实践中的踩坑小结
2017/07/04 Javascript
javascript 开发之网页兼容各种浏览器
2017/09/28 Javascript
解决Vue axios post请求,后台获取不到数据的问题方法
2018/08/11 Javascript
layui: layer.open加载窗体时出现遮罩层的解决方法
2019/09/26 Javascript
JS三级联动代码格式实例详解
2019/12/30 Javascript
vue样式穿透 ::v-deep的具体使用
2020/06/04 Javascript
js删除指定位置超链接中含有百度与360的标题
2021/01/06 Javascript
[48:20]OpTic vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python中的魔法方法深入理解
2014/07/09 Python
Python的“二维”字典 (two-dimension dictionary)定义与实现方法
2016/04/27 Python
Python画图学习入门教程
2016/07/01 Python
pandas数据框,统计某列数据对应的个数方法
2018/04/11 Python
Python网页正文转换语音文件的操作方法
2018/12/09 Python
python3实现多线程聊天室
2018/12/12 Python
Python多进程fork()函数详解
2019/02/22 Python
详解Python绘图Turtle库
2019/10/12 Python
Python3与fastdfs分布式文件系统如何实现交互
2020/06/23 Python
使用npy转image图像并保存的实例
2020/07/01 Python
通用的Django注册功能模块实现方法
2021/02/05 Python
外企测试工程师面试题
2015/02/01 面试题
大专学生推荐信范文
2013/11/19 职场文书
11月红领巾广播稿
2014/01/17 职场文书
名企HR怎样看待求职信
2014/02/23 职场文书
高中军训感想300字
2014/03/04 职场文书
讲党性心得体会
2014/09/03 职场文书
民主生活会批评与自我批评总结
2014/10/17 职场文书
表扬通报怎么写
2015/01/16 职场文书
2015年医院后勤工作总结
2015/05/20 职场文书
地道战观后感500字
2015/06/04 职场文书
导游词之香港-太平山顶
2019/10/18 职场文书
SQL之各种join小结详细讲解
2021/08/04 MySQL