JavaScript高级程序设计 阅读笔记(十四) js继承机制的实现


Posted in Javascript onAugust 14, 2012

继承

继承是面向对象语言的必备特征,即一个类能够重用另一个类的方法和属性。在JavaScript中继承方式的实现方式主要有以下五种:对象冒充、call()、apply()、原型链、混合方式。

下面分别介绍。

对象冒充

原理:构造函数使用this关键字给所有属性和方法赋值。因为构造函数只是一个函数,所以可以使ClassA的构造函数成为ClassB的方法,然后调用它。ClassB就会收到ClassA的构造函数中定义的属性和方法。

示例:

function ClassA(sColor){ 
this.color=sColor; 
this.sayColor=function(){ 
alert(this.color); 
} 
} function ClassB(sColor,sName){ 
this.newMethod=ClassA; 
this.newMethod(sColor); 
delete this.newMethod; 
this.name=sName; 
this.sayName=function(){ 
alert(this.name); 
} 
}

调用:
var objb=new ClassB("blue","Test"); 
objb.sayColor();// 
blueobjb.sayName(); // Test

注意:这里要删除对ClassA的引用,否则在后面定义新的方法和属性会覆盖超类的相关属性和方法。用这种方式可以实现多重继承。

call()方法

由于对象冒充方法的流行,在ECMAScript的第三版对Function对象加入了两个新方法 call()和apply()方法来实现相似功能。

call()方法的第一个参数用作this的对象,其他参数都直接传递给函数自身。示例:

function sayColor(sPrefix,sSuffix){ 
alert(sPrefix+this.color+sSuffix); 
} var obj=new Object(); 
obj.color="red"; 
//output The color is red, a very nice color indeed. 
sayColor.call(obj,"The color is ",", a very nice color indeed.");

 使用此方法来实现继承,只需要将前三行的赋值、调用、删除代码替换即可:
function ClassB(sColor,sName){ 
//this.newMethod=ClassA; 
//this.newMethod(sColor); 
//delete this.newMethod; 
ClassA.call(this,sColor); this.name=sName; 
this.sayName=function(){ 
alert(this.name); 
} 
}

apply()方法

apply()方法跟call()方法类似,不同的是第二个参数,在apply()方法中传递的是一个数组。

function sayColor(sPrefix,sSuffix){ 
alert(sPrefix+this.color+sSuffix); 
} var obj=new Object(); 
obj.color="red"; 
//output The color is red, a very nice color indeed. 
sayColor.apply(obj,new Array("The color is ",", a very nice color indeed."));

使用此方法来实现继承,只需要将前三行的赋值、调用、删除代码替换即可:
function ClassB(sColor,sName){ 
//this.newMethod=ClassA; 
//this.newMethod(sColor); 
//delete this.newMethod; 
ClassA.apply(this,new Array(sColor)); this.name=sName; 
this.sayName=function(){ 
alert(this.name); 
} 
}

跟call()有一点不同的是,如果超类中的参数顺序与子类中的参数顺序完全一致,第二个参数可以用arguments。

原型链

继承这种形式在ECMAScript中原本是用于原型链的。Prototype对象的任何属性和方法都被传递给那个类的所有实例。原型链利用这种功能实现继承机制。

用原型链实现继承示例:

function ClassA(){ 
} ClassA.prototype.color="red"; 
ClassA.prototype.sayColor=function(){ 
alert(this.color); 
}; 
function ClassB(){ 
} 
ClassB.prototype=new ClassA();

 注意:调用ClassA的构造函数时,没有给它传递参数。这在原型链中是标准的做法,要确保构造函数没有任何参数。

混合方式

这种方式混合了对象冒充和原型链方式。示例:

function ClassA(sColor){ 
this.color=sColor; 
} 
ClassA.prototype.sayColor=function(){ 
alert(this.color); 
} function ClassB(sColor,sName){ 
ClassA.call(this,sColor); 
this.name=sName; 
} 
ClassB.prototype=new ClassA(); 
ClassB.prototype.sayName=function(){ 
alert(this.name); 
}

调用示例:
var objb=new ClassB("red","test"); 
objb.sayColor();// output red 
objb.sayName();// output test

作者:Artwl
Javascript 相关文章推荐
Yii-自定义删除确认弹框(zyd)jquery实现代码
Mar 04 Javascript
javascript 禁用IE工具栏,导航栏等等实现代码
Apr 01 Javascript
jquery和javascript的区别(常用方法比较)
Jul 04 Javascript
基于JavaScript实现动态添加删除表格的行
Feb 01 Javascript
巧用jQuery选择器提高写表单效率的方法
Aug 19 Javascript
jquery插件treegrid树状表格的使用方法详解(.Net平台)
Jan 03 Javascript
JS正则表达式验证账号、手机号、电话和邮箱是否合法
Mar 08 Javascript
基于vue实现swipe分页组件实例
May 25 Javascript
简单实现jQuery上传图片显示预览功能
Jun 29 jQuery
js精确的加减乘除实例
Nov 14 Javascript
ng-zorro-antd 入门初体验
Dec 03 Javascript
Vue框架TypeScript装饰器使用指南小结
Feb 18 Javascript
JavaScript高级程序设计 阅读笔记(十三) js定义类或对象
Aug 14 #Javascript
JavaScript高级程序设计 阅读笔记(十二) js内置对象Math
Aug 14 #Javascript
jQuery 1.8 Release版本发布了
Aug 14 #Javascript
常用一些Javascript判断函数
Aug 14 #Javascript
分享精心挑选的23款美轮美奂的jQuery 图片特效插件
Aug 14 #Javascript
JavaScript 布尔操作符解析  && || !
Aug 10 #Javascript
JS多物体 任意值 链式 缓冲运动
Aug 10 #Javascript
You might like
在php中取得image按钮传递的name值
2006/10/09 PHP
PHP定时执行任务实现方法详解(Timer)
2015/07/30 PHP
JavaScript中setAttribute用法介绍
2013/07/20 Javascript
Javascript获取当前日期的农历日期代码
2014/10/08 Javascript
js制作简易年历完整实例
2015/01/28 Javascript
jQuery使用empty()方法删除元素及其所有子元素的方法
2015/03/26 Javascript
简介JavaScript中的setTime()方法的使用
2015/06/11 Javascript
jQuery插件之Tocify动态节点目录菜单生成器附源码下载
2016/01/08 Javascript
BootStrap Table 后台数据绑定、特殊列处理、排序功能
2017/05/27 Javascript
JS图片延迟加载插件LazyImgv1.0用法分析【附demo源码下载】
2017/09/04 Javascript
prototype.js简单实现ajax功能示例
2017/10/18 Javascript
用vue2.0实现点击选中active其他选项互斥的效果
2018/04/12 Javascript
详解小程序设置缓存并且不覆盖原有数据
2019/04/15 Javascript
JS实现的碰撞检测与周期移动完整示例
2019/09/02 Javascript
vue 使用高德地图vue-amap组件过程解析
2019/09/07 Javascript
layer ui 导入文件之前传入数据的实例
2019/09/23 Javascript
详解小程序云开发攻略(解决最棘手的问题)
2019/09/30 Javascript
关于Vue中axios的封装实例详解
2019/10/20 Javascript
支付宝小程序实现省市区三级联动
2020/06/21 Javascript
[04:20]DOTA2-DPC中国联赛 正赛 VG vs LBZS 选手采访 1月19日
2021/03/11 DOTA
使用Python判断质数(素数)的简单方法讲解
2016/05/05 Python
Python走楼梯问题解决方法示例
2018/07/25 Python
Django中日期处理注意事项与自定义时间格式转换详解
2018/08/06 Python
Python抓包程序mitmproxy安装和使用过程图解
2020/03/02 Python
获取CSDN文章内容并转换为markdown文本的python
2020/09/06 Python
瑞士最大的图书贸易公司:Orell Füssli
2019/12/28 全球购物
高一物理教学反思
2014/01/24 职场文书
四年级科学教学反思
2014/02/10 职场文书
优秀应届本科生求职信
2014/07/19 职场文书
行政专员岗位职责说明书
2014/09/01 职场文书
2015年教师节活动总结
2015/03/20 职场文书
证婚人婚礼致辞
2015/07/28 职场文书
爱国之歌(8首)
2019/09/29 职场文书
励志语录:只有自己足够强大,才能不被别人践踏
2020/01/09 职场文书
详解MySQL数据库千万级数据查询和存储
2021/05/18 MySQL
Python获取江苏疫情实时数据及爬虫分析
2021/08/02 Python