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 相关文章推荐
Extjs4中的分页应用结合前后台
Dec 13 Javascript
jquery实现的蓝色二级导航条效果代码
Aug 24 Javascript
Bootstrap网格系统详解
Apr 26 Javascript
jquery组件WebUploader文件上传用法详解
Oct 23 Javascript
前端开发不得不知的10个最佳ES6特性
Aug 30 Javascript
VUE + UEditor 单图片跨域上传功能的实现方法
Feb 08 Javascript
vue debug 二种方法
Sep 16 Javascript
微信小程序使用swiper组件实现层叠轮播图
Nov 04 Javascript
详解项目升级到vue-cli3的正确姿势
Jan 28 Javascript
JS性能优化实现方法及优点进行
Aug 30 Javascript
js将日期格式转换为YYYY-MM-DD HH:MM:SS
Sep 18 Javascript
梳理一下vue中的生命周期
Dec 30 Vue.js
鼠标事件的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 服务器调试 Zend Debugger 的安装教程
2009/09/25 PHP
php实现memcache缓存示例讲解
2013/12/04 PHP
分享一则PHP定义函数代码
2015/02/26 PHP
一个简单的php MVC留言本实例代码(必看篇)
2016/09/22 PHP
Laravel框架模型的创建及模型对数据操作示例
2019/05/07 PHP
javascript 函数声明与函数表达式的区别介绍
2013/10/05 Javascript
jquery中EasyUI使用技巧小结
2015/02/10 Javascript
Nodejs学习笔记之测试驱动
2015/04/16 NodeJs
javascript实现简单的进度条
2015/07/02 Javascript
原生JavaScript实现Ajax的方法
2016/04/07 Javascript
iOS和Android用同一个二维码实现跳转下载链接的方法
2016/09/28 Javascript
浅谈jQuery绑定事件会叠加的解决方法和心得总结
2016/10/26 Javascript
获取今天,昨天,本周,上周,本月,上月时间(实例分享)
2017/01/04 Javascript
Vue2 配置 Axios api 接口调用文件的方法
2017/11/13 Javascript
详解Node.js中path模块的resolve()和join()方法的区别
2018/10/29 Javascript
Angular2 自定义表单验证器的实现方法
2018/12/14 Javascript
Cocos2d实现刮刮卡效果
2018/12/20 Javascript
详解小程序毫秒级倒计时(适用于拼团秒杀功能)
2019/05/05 Javascript
vue.js路由mode配置之去掉url上默认的#方法
2019/11/01 Javascript
vue中使用GraphQL的实例代码
2019/11/04 Javascript
使用Python设置tmpfs来加速项目的教程
2015/04/17 Python
教你学会使用Python正则表达式
2017/09/07 Python
python中requests爬去网页内容出现乱码问题解决方法介绍
2017/10/25 Python
Python文本统计功能之西游记用字统计操作示例
2018/05/07 Python
python解析xml简单示例
2019/06/21 Python
python如何通过pyqt5实现进度条
2020/01/20 Python
python实现输入三角形边长自动作图求面积案例
2020/04/12 Python
英国第一的市场和亚马逊替代品:OnBuy
2019/03/16 全球购物
结婚典礼证婚词
2014/01/11 职场文书
节约用水倡议书
2014/04/16 职场文书
家长会欢迎词
2015/01/23 职场文书
电影建党伟业观后感
2015/06/01 职场文书
本地通过nginx配置反向代理的全过程记录
2021/03/31 Servers
JS实现扫雷项目总结
2021/05/19 Javascript
使用pandas生成/读取csv文件的方法实例
2021/07/09 Python
青岛市的收音机研制与生产
2022/04/07 无线电