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 相关文章推荐
Javascript操纵Cookie实现购物车程序
Feb 15 Javascript
基于jQuery的弹出警告对话框美化插件(警告,确认和提示)
Jun 10 Javascript
实例详解JSON数据格式及json格式数据域字符串相互转换
Jan 07 Javascript
jQuery中$.each()函数的用法引申实例
May 12 Javascript
JavaScript上传文件时不用刷新页面方法总结(推荐)
Aug 15 Javascript
详解如何使用webpack在vue项目中写jsx语法
Nov 08 Javascript
Vue实现自定义下拉菜单功能
Jul 16 Javascript
微信小程序ibeacon三点定位详解
Oct 31 Javascript
详解babel升级到7.X采坑总结
May 12 Javascript
JS替换字符串中指定位置的字符(多种方法)
May 28 Javascript
Vue 使用iframe引用html页面实现vue和html页面方法的调用操作
Nov 16 Javascript
JavaScript对象访问器Getter及Setter原理解析
Dec 08 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 fopen()和 file_get_contents()应用与差异介绍
2014/03/19 PHP
Linux操作系统安装LAMP环境
2015/06/26 PHP
分享PHP函数实现数字与文字分页代码
2015/07/28 PHP
点图片上一页下一页翻页效果
2008/07/09 Javascript
js获取字符串最后一位方法汇总
2014/11/13 Javascript
jQuery中siblings()方法用法实例
2015/01/08 Javascript
jquery实现最简单的滑动菜单效果代码
2015/09/12 Javascript
AngularJS中$watch和$timeout的使用示例
2016/09/20 Javascript
jquery.Jcrop结合JAVA后台实现图片裁剪上传实例
2016/11/05 Javascript
jQuery实现二维码扫描功能
2017/01/09 Javascript
js中toString()和String()区别详解
2017/03/23 Javascript
详解前后端分离之VueJS前端
2017/05/24 Javascript
js防刷新的倒计时代码 js倒计时代码
2017/09/06 Javascript
ligerUI---ListBox(列表框可移动的实例)
2017/11/28 Javascript
JavaScript实现的文本框placeholder提示文字功能示例
2018/07/25 Javascript
JS实现把一个页面层数据传递到另一个页面的两种方式
2018/08/13 Javascript
jQuery实现表格的增、删、改操作示例
2019/01/27 jQuery
JavaScript写个贪吃蛇小游戏(超详细)
2020/03/17 Javascript
react基本安装与测试示例
2020/04/27 Javascript
vue3.0自定义指令(drectives)知识点总结
2020/12/27 Vue.js
Python魔术方法详解
2015/02/14 Python
Python SMTP发送邮件遇到的一些问题及解决办法
2018/10/24 Python
Python设计模式之外观模式实例详解
2019/01/17 Python
TFRecord文件查看包含的所有Features代码
2020/02/17 Python
python实现定时发送邮件
2020/12/23 Python
JD Sports澳洲官网:英国领先的运动鞋和运动时尚零售商
2020/02/15 全球购物
什么是反射?如何实现反射?
2016/07/25 面试题
出口公司经理求职简历中的自我评价
2013/10/13 职场文书
你懂得怎么写自荐信吗?
2013/12/27 职场文书
工地质量标语
2014/06/12 职场文书
党员群众路线教育实践活动学习笔记
2014/11/05 职场文书
少先队辅导员事迹材料
2014/12/24 职场文书
自愿离婚协议书2015
2015/01/26 职场文书
论文致谢词范文
2015/05/14 职场文书
董事长新年致辞
2015/07/29 职场文书
银行工作心得体会范文
2016/01/23 职场文书