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 闭包究竟是什么
Apr 12 Javascript
点击弹出层外区域关闭弹出层jquery特效示例
Aug 25 Javascript
js的for in循环和java里foreach循环的区别分析
Jan 28 Javascript
JavaScript实现带播放列表的音乐播放器实例分享
Mar 07 Javascript
JS实现登录页面记住密码和enter键登录方法推荐
May 10 Javascript
Express URL跳转(重定向)的实现方法
Apr 07 Javascript
vue中的event bus非父子组件通信解析
Oct 27 Javascript
ReactNative实现Toast的示例
Dec 31 Javascript
vue+springboot前后端分离实现单点登录跨域问题解决方法
Jan 30 Javascript
js提取中文拼音首字母的封装工具类
Mar 12 Javascript
express.js中间件说明详解
Mar 19 Javascript
Vue 封装防刷新考试倒计时组件的实现
Jun 05 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
截获网站title标签之家内容的例子
2006/10/09 PHP
SMARTY学习手记
2007/01/04 PHP
php ss7.5的数据调用 (笔记)
2010/03/08 PHP
解析PHP中常见的mongodb查询操作
2013/06/20 PHP
Yii2配置Nginx伪静态的方法
2017/05/05 PHP
jscript之Read an Excel Spreadsheet
2007/06/13 Javascript
div移动 输入框不能输入的问题
2009/11/19 Javascript
FileUpload 控件 禁止手动输入或粘贴的实现代码
2010/04/07 Javascript
基于jquery的图片幻灯展示源码
2012/07/15 Javascript
js随机颜色代码的多种实现方式
2013/04/23 Javascript
GRID拖拽行的实例代码
2013/07/18 Javascript
Jquery 切换不同图片示例代码
2013/12/05 Javascript
js实现文本框选中的方法
2015/05/26 Javascript
javascript中for/in循环及使用技巧
2015/09/01 Javascript
浅谈jquery的map()和each()方法
2016/06/12 Javascript
jQuery过滤选择器用法示例
2016/09/12 Javascript
js cookie实现记住密码功能
2017/01/17 Javascript
关于axios返回空对象的问题解决
2017/04/04 Javascript
微信小程序出现wx.getLocation再次授权问题的解决方法分析
2019/01/16 Javascript
ckeditor一键排版功能实现方法分析
2020/02/06 Javascript
javascript自定义加载loading效果
2020/09/15 Javascript
python实现ftp客户端示例分享
2014/02/17 Python
Python中set与frozenset方法和区别详解
2016/05/23 Python
python获取指定时间差的时间实例详解
2017/04/11 Python
TensorFlow实现AutoEncoder自编码器
2018/03/09 Python
python实现简易动态时钟
2018/11/19 Python
钉钉群自定义机器人消息Python封装的实例
2019/02/20 Python
Python并发concurrent.futures和asyncio实例
2020/05/04 Python
使用Python画了一棵圣诞树的实例代码
2020/11/27 Python
IE9下html5初试小刀
2010/09/21 HTML / CSS
html5中为audio标签增加停止按钮动作实现方法
2013/01/04 HTML / CSS
北美领先的牛仔品牌:Buffalo David Bitton
2017/05/22 全球购物
Stefania Mode美国:奢华设计师和时尚服装
2018/01/07 全球购物
TUMI新加坡官网:国际领先的商旅箱包品牌
2019/01/12 全球购物
2015年政风行风工作总结
2015/04/21 职场文书
vue项目打包后路由错误的解决方法
2022/04/13 Vue.js