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 原型与继承说明
Jun 09 Javascript
DOM Scripting中的图片切换[兼容Firefox]
Jun 12 Javascript
js加密解密字符串可自定义密码因子
May 13 Javascript
js实现select跳转功能代码
Oct 22 Javascript
javascript的正则匹配方法学习
Feb 24 Javascript
javascript中replace使用方法总结
Mar 01 Javascript
jQuery插件zTree实现单独选中根节点中第一个节点示例
Mar 08 Javascript
JS实现自动轮播图效果(自适应屏幕宽度+手机触屏滑动)
Jun 19 Javascript
简单谈谈原生js的math对象
Jun 27 Javascript
用React实现一个完整的TodoList的示例代码
Oct 30 Javascript
JavaScript引用类型之基本包装类型实例分析【Boolean、Number和String】
Aug 09 Javascript
(开源)微信小程序+mqtt,esp8266温湿度读取
Apr 02 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
用DBSQL类加快开发MySQL数据库程序的速度
2006/10/09 PHP
PHP提示Warning:phpinfo() has been disabled函数禁用的解决方法
2014/12/17 PHP
thinkPHP5.0框架URL访问方法详解
2017/03/18 PHP
fireworks菜单生成器mm_menu.js在 IE 7.0 显示问题的解决方法
2009/10/20 Javascript
jquery 简单应用示例总结
2013/08/09 Javascript
js中继承的几种用法总结(apply,call,prototype)
2013/12/26 Javascript
理解Angular数据双向绑定
2016/01/10 Javascript
基于javascript实现简单的抽奖系统
2020/04/15 Javascript
JS中dom0级事件和dom2级事件的区别介绍
2016/05/05 Javascript
jQuery实现图片轮播效果代码(基于jquery.pack.js插件)
2016/06/02 Javascript
Vue.js仿微信聊天窗口展示组件功能
2017/08/11 Javascript
浅谈Angular 中何时取消订阅
2017/11/22 Javascript
jQuery+SpringMVC中的复选框选择与传值实例
2018/01/08 jQuery
jQuery实现鼠标响应式透明度渐变动画效果示例
2018/02/13 jQuery
如何制作一个Node命令行图像识别工具
2018/12/12 Javascript
javascript设计模式之迭代器模式
2020/01/30 Javascript
小程序选项卡以及swiper套用(跨页面)
2020/06/19 Javascript
python操作xml文件详细介绍
2014/06/09 Python
python实现同时给多个变量赋值的方法
2015/04/30 Python
Anaconda多环境多版本python配置操作方法
2017/09/12 Python
Python中的TCP socket写法示例
2018/05/11 Python
python装饰器常见使用方法分析
2019/06/26 Python
Django在pycharm下修改默认启动端口的方法
2019/07/26 Python
python中设置超时跳过,超时退出的方式
2019/12/13 Python
详解Python+Selenium+ChromeDriver的配置和问题解决
2021/01/19 Python
谈谈对css属性box-sizing的了解
2017/01/04 HTML / CSS
波兰在线体育用品商店:Hop-Sport.pl
2019/07/23 全球购物
大课间活动制度
2014/01/18 职场文书
初三学习决心书
2014/03/11 职场文书
2014年社区党建工作总结
2014/11/11 职场文书
2014年客房部工作总结
2014/11/22 职场文书
小学优秀教师事迹材料
2014/12/16 职场文书
物流业务员岗位职责
2015/04/03 职场文书
小学生读书笔记范文
2015/06/30 职场文书
Python深度学习之实现卷积神经网络
2021/06/05 Python
Java常用函数式接口总结
2021/06/29 Java/Android