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 相关文章推荐
JS 分号引起的一段调试问题
Jun 18 Javascript
JavaScript 异步调用框架 (Part 6 - 实例 & 模式)
Aug 04 Javascript
js中的getAttribute方法使用示例
Aug 01 Javascript
JS实现iframe编辑器光标位置插入内容的方法(兼容IE和Firefox)
Jun 24 Javascript
JS图片左右无缝隙滚动的实现(兼容IE,Firefox 遵循W3C标准)
Sep 23 Javascript
BootStrap Validator使用注意事项(必看篇)
Sep 28 Javascript
详解JavaScript跨域总结与解决办法
Oct 31 Javascript
Vue2实时监听表单变化的示例讲解
Aug 30 Javascript
Vue 通过自定义指令回顾v-内置指令(小结)
Sep 03 Javascript
浅谈js闭包理解
Mar 28 Javascript
jQuery实现小火箭返回顶部特效
Feb 03 jQuery
卸载vue2.0并升级vue_cli3.0的实例讲解
Feb 16 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结合js实现点击超链接执行删除确认操作
2014/10/31 PHP
PHP和Shell实现检查SAMBA与NFS Server是否存在
2015/01/07 PHP
Windows2003下php5.4安装配置教程(IIS)
2016/06/30 PHP
php分页查询的简单实现代码
2017/03/14 PHP
php数据库的增删改查 php与javascript之间的交互
2017/08/31 PHP
JavaScript中获取元素索引的函数
2010/09/10 Javascript
js禁止页面刷新与后退的方法
2015/06/08 Javascript
jquery实现仿Flash的横向滑动菜单效果代码
2015/09/17 Javascript
使用 JavaScript 进行函数式编程 (一) 翻译
2015/10/02 Javascript
javascript实现PC网页里的拖拽效果
2016/03/14 Javascript
JS弹出层遮罩,隐藏背景页面滚动条细节优化分析
2016/04/29 Javascript
jQuery购物车插件jsorder用法(支持后台处理程序直接转换成DataTable处理)
2016/06/08 Javascript
jquery.serialize() 函数语法及简单实例
2016/07/08 Javascript
JS导出PDF插件的方法(支持中文、图片使用路径)
2016/07/12 Javascript
JS 实现 ajax 异步浏览器兼容问题
2017/01/21 Javascript
JavaScript实现的冒泡排序法及统计相邻数交换次数示例
2017/04/26 Javascript
基于jQuery实现的Ajax 验证用户名唯一性实例代码
2017/06/28 jQuery
记React connect的几种写法(小结)
2018/09/18 Javascript
详解webpack4之splitchunksPlugin代码包分拆
2018/12/04 Javascript
浅析vue中的provide / inject 有什么用处
2019/11/10 Javascript
vuex入门最详细整理
2020/03/04 Javascript
vue + el-form 实现的多层循环表单验证
2020/11/25 Vue.js
python 文件与目录操作
2008/12/24 Python
简单讲解Python编程中namedtuple类的用法
2016/06/21 Python
python虚拟环境virualenv的安装与使用
2016/12/18 Python
Python3爬虫学习之爬虫利器Beautiful Soup用法分析
2018/12/12 Python
python 使用plt画图,去除图片四周的白边方法
2019/07/09 Python
python生成并处理uuid的实现方式
2020/03/03 Python
详解利用canvas实现环形进度条的方法
2019/06/12 HTML / CSS
Marlies Dekkers内衣荷兰官方网店:荷兰奢侈内衣品牌
2020/03/27 全球购物
春季防火方案
2014/05/10 职场文书
党支部综合考察材料
2014/05/19 职场文书
生活部的活动方案
2014/08/19 职场文书
工作汇报开头与结尾怎么写
2014/11/08 职场文书
死者家属慰问信
2015/03/24 职场文书
实施意见格式范本
2015/06/05 职场文书