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方法和技巧大全
Dec 27 Javascript
初学js插入节点appendChild insertBefore使用方法
Jul 04 Javascript
深入理解javascript变量声明
Nov 20 Javascript
JavaScript编程中实现对象封装特性的实例讲解
Jun 24 Javascript
浅谈AngularJs指令之scope属性详解
Oct 24 Javascript
浅谈js在html中的加载执行顺序,多个jquery ready执行顺序
Nov 26 Javascript
原生js更改css样式的两种方式
Mar 15 Javascript
用 js 的 selection range 操作选择区域内容和图片
Apr 18 Javascript
在bootstrap中实现轮播图实例代码
Jun 11 Javascript
重置Redux的状态数据的方法实现
Nov 18 Javascript
ant-design-vue 实现表格内部字段验证功能
Dec 16 Javascript
Rust中的Struct使用示例详解
Aug 14 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
对盗链说再见...
2006/10/09 PHP
简单的用PHP编写的导航条程序
2006/10/09 PHP
在WAMP环境下搭建ZendDebugger php调试工具的方法
2011/07/18 PHP
PHP遍历目录并返回统计目录大小
2014/06/09 PHP
用 Composer构建自己的 PHP 框架之构建路由
2014/10/30 PHP
PHP自毁程序(慎用)
2015/07/09 PHP
PHP设置头信息及取得返回头信息的方法
2016/01/25 PHP
php生成无限栏目树
2017/03/16 PHP
MooTools 1.2中的Drag.Move来实现拖放
2009/09/15 Javascript
基于jquery的仿百度的鼠标移入图片抖动效果
2010/09/17 Javascript
contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2011/09/13 Javascript
Jquery选中或取消radio示例
2013/09/29 Javascript
使用JavaScript链式编程实现模拟Jquery函数
2014/12/21 Javascript
基于jQuery插件实现环形图标菜单旋转切换特效
2015/05/15 Javascript
使用AngularJS和PHP的Laravel实现单页评论的方法
2015/06/19 Javascript
干货分享:让你分分钟学会javascript闭包
2015/12/25 Javascript
炫酷的js手风琴效果
2016/10/13 Javascript
AngularJS ng-repeat数组有重复值的解决方法
2016/10/23 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(二)
2017/05/11 Javascript
Vuex持久化插件(vuex-persistedstate)解决刷新数据消失的问题
2019/04/16 Javascript
Mpvue中使用Vant Weapp组件库的方法步骤
2019/05/16 Javascript
[49:20]2014 DOTA2国际邀请赛中国区预选赛5.21 CIS VS TongFu
2014/05/22 DOTA
[03:04]2018年国际邀请赛典藏宝瓶&莱恩声望物品展示 片尾有彩蛋
2018/06/04 DOTA
[58:25]VP vs RNG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
在Django的模板中使用认证数据的方法
2015/07/23 Python
python对DICOM图像的读取方法详解
2017/07/17 Python
python 重定向获取真实url的方法
2018/05/11 Python
如何利用python制作时间戳转换工具详解
2018/09/12 Python
解决python3 Pycharm上连接数据库时报错的问题
2018/12/03 Python
python爬虫开发之Beautiful Soup模块从安装到详细使用方法与实例
2020/03/09 Python
tensorflow下的图片标准化函数per_image_standardization用法
2020/06/30 Python
python如何设置静态变量
2020/09/07 Python
css3实现背景颜色渐变让图片不再是唯一的实现方式
2012/12/18 HTML / CSS
应届医学毕业生求职信分享
2013/12/02 职场文书
学习十八届四中全会依法治国心得体会
2014/11/03 职场文书
JavaScript的Set数据结构详解
2022/02/18 Javascript