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 类
Nov 07 Javascript
使用jquery读取html5 localstorage的值的方法
Jan 04 Javascript
jquery基础教程之数组使用详解
Mar 10 Javascript
js获取本机操作系统类型的两种方法
Dec 19 Javascript
关于Javascript回调函数的一个妙用
Aug 29 Javascript
详解jQuery中ajax.load()方法
Jan 25 Javascript
js放到head中失效的原因与解决方法
Mar 07 Javascript
discuz表情的JS提取方法分析
Mar 22 Javascript
Vue-Quill-Editor富文本编辑器的使用教程
Sep 21 Javascript
纯js实现无缝滚动功能代码实例
Feb 21 Javascript
AI小程序之语音听写来了,十分钟掌握百度大脑语音听写全攻略
Mar 13 Javascript
Node Mongoose用法详解【Mongoose使用、Schema、对象、model文档等】
May 13 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 htmlspecialchars()与shtmlspecialchars()函数的深入分析
2013/06/05 PHP
如何让thinkphp在模型中自动完成session赋值小教程
2014/09/05 PHP
详解WordPress开发中wp_title()函数的用法
2016/01/07 PHP
jquery attr方法获取input的checked属性问题
2014/05/26 Javascript
jQuery中[attribute]选择器用法实例
2014/12/31 Javascript
javascript闭包的理解
2015/04/01 Javascript
jQuery Validate插件实现表单强大的验证功能
2015/12/18 Javascript
Bootstrap基本插件学习笔记之Tooltip提示工具(18)
2016/12/08 Javascript
JavaScript 网页中实现一个计算当年还剩多少时间的倒数计时程序
2017/01/25 Javascript
Bootstrap的popover(弹出框)2秒后定时消失的实现代码
2017/02/27 Javascript
js编写简单的聊天室功能
2017/08/17 Javascript
微信小程序用户自定义模版用法实例分析
2017/11/28 Javascript
vue+canvas实现移动端手写签名
2020/05/21 Javascript
Flexible.js可伸缩布局实现方法详解
2020/11/13 Javascript
神经网络python源码分享
2017/12/15 Python
读取json格式为DataFrame(可转为.csv)的实例讲解
2018/06/05 Python
Python基本socket通信控制操作示例
2019/01/30 Python
Python中psutil的介绍与用法
2019/05/02 Python
tensorflow多维张量计算实例
2020/02/11 Python
Python制作简单的剪刀石头布游戏
2020/12/10 Python
乐高积木玩具美国官网:LEGO Shop US
2016/09/16 全球购物
Vans(范斯)德国官网:美国南加州的原创极限运动潮牌
2017/05/02 全球购物
Foreo国际站:Foreo International
2018/10/29 全球购物
中职生自我鉴定范文
2013/10/03 职场文书
教师实习的自我鉴定
2013/10/26 职场文书
军训的自我鉴定
2013/12/10 职场文书
大学生的自我鉴定范文
2014/01/21 职场文书
经理管理专业毕业自荐书范文
2014/02/12 职场文书
摄影专业毕业生求职信
2014/03/13 职场文书
党员教师一句话承诺
2014/05/30 职场文书
土建工程师岗位职责
2014/06/10 职场文书
2014年加油站工作总结
2014/12/04 职场文书
先进事迹材料范文
2014/12/29 职场文书
何时使用Map来代替普通的JS对象
2021/04/29 Javascript
pycharm 如何查看某一函数源码的快捷键
2021/05/12 Python
详细了解MVC+proxy
2021/07/09 Java/Android