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 13 Javascript
解决Extjs上传图片无法预览的解决方法
Mar 22 Javascript
JavaScript 验证码的实例代码(附效果图)
Mar 22 Javascript
为Javascript中的String对象添加去除左右空格的方法(示例代码)
Nov 30 Javascript
跟我学习javascript的定时器
Nov 19 Javascript
JQuery移动页面开发之屏幕方向改变与滚屏的实现
Dec 03 Javascript
JavaScript定义函数_动力节点Java学院整理
Jun 27 Javascript
javascript基于牛顿迭代法实现求浮点数的平方根【递归原理】
Sep 28 Javascript
vue 运用mock数据的示例代码
Nov 07 Javascript
微信小程序自定义可滑动顶部TabBar选项卡实现页面切换功能示例
May 14 Javascript
JAVA面试题 static关键字详解
Jul 16 Javascript
Vue3配置axios跨域实现过程解析
Nov 25 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
Zend Framework分页类用法详解
2016/03/22 PHP
PHP使用观察者模式处理异常信息的方法详解
2019/09/24 PHP
浅谈laravel框架与thinkPHP框架的区别
2019/10/23 PHP
用倒置滤镜把div倒置,再把table倒置。
2007/07/31 Javascript
基于jQuery的的一个隔行变色,鼠标移动变色的小插件
2010/07/06 Javascript
设置iframe的document.designMode后仅Firefox中其body.innerHTML为br
2012/02/27 Javascript
Node.js和PHP根据ip获取地理位置的方法
2014/03/14 Javascript
JS实现的左侧竖向滑动菜单效果代码
2015/10/19 Javascript
浅谈javascript中的constructor
2016/06/08 Javascript
jQuery Validate设置onkeyup验证的实例代码
2016/12/09 Javascript
React快速入门教程
2017/01/17 Javascript
Ionic 2 实现列表滑动删除按钮的方法
2017/01/22 Javascript
jQuery弹出窗口简单实现代码
2017/03/09 Javascript
NodeJS学习笔记之Module的简介
2017/03/24 NodeJs
JavaScript实现三级联动效果
2017/07/15 Javascript
JS实现验证码倒计时的注册页面
2018/01/02 Javascript
jquery应用实例分享_实现手风琴特效
2018/02/01 jQuery
vue使用iframe嵌入网页的示例代码
2020/06/09 Javascript
AngularJs中$cookies简单用法分析
2019/05/30 Javascript
通过JS深度判断两个对象字段相同
2019/06/14 Javascript
es6中Promise 对象基本功能与用法实例分析
2020/02/23 Javascript
解决vue下载后台传过来的乱码流的问题
2020/12/05 Vue.js
对pandas replace函数的使用方法小结
2018/05/18 Python
解决python 自动安装缺少模块的问题
2018/10/22 Python
美国现代家具和家居商店:Apt2B
2016/08/29 全球购物
美国职棒大联盟的官方手套、球和头盔:Rawlings
2020/02/15 全球购物
电信专业毕业生推荐信
2013/11/18 职场文书
食品安全处置方案
2014/06/14 职场文书
2014党的群众路线教育实践活动总结报告
2014/10/31 职场文书
乡镇党建工作总结2015
2015/05/19 职场文书
全陪导游词开场白
2015/05/29 职场文书
初中毕业生感言
2015/07/31 职场文书
评估“风险”创业计划的几大要点
2019/08/12 职场文书
python实现简单反弹球游戏
2021/04/12 Python
python使用matplotlib绘制图片时x轴的刻度处理
2021/08/30 Python
vue 把二维或多维数组转一维数组
2022/04/24 Vue.js