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 相关文章推荐
javascript window.confirm确认 取消对话框实现代码小结
Oct 21 Javascript
图片轮换效果实现代码(点击按钮停止执行)
Apr 12 Javascript
javascript实现TreeView 无刷新展开的实例代码
Jul 13 Javascript
JQuery和PHP结合实现动态进度条上传显示
Nov 23 Javascript
原生js实现日期计算器功能
Feb 17 Javascript
js数字计算 误差问题的快速解决方法
Feb 28 Javascript
React.js中常用的ES6写法总结(推荐)
May 09 Javascript
Vue.js划分组件的方法
Oct 29 Javascript
对vue中v-on绑定自定事件的实例讲解
Sep 06 Javascript
简谈创建React Component的几种方式
Jun 15 Javascript
微信小程序实现音频文件播放进度的实例代码
Mar 02 Javascript
Vue跨域请求问题解决方案过程解析
Aug 07 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的类 功能齐全的发送邮件类
2006/10/09 PHP
windows下PHP APACHE MYSQ完整配置
2007/01/02 PHP
PHP 采集心得技巧
2009/05/15 PHP
PHP 数组遍历方法大全(foreach,list,each)
2010/06/30 PHP
PHP程序开发范例学习之表单 获取文本框的值
2011/08/08 PHP
php实现的树形结构数据存取类实例
2014/11/29 PHP
php实现的SSO单点登录系统接入功能示例分析
2016/10/12 PHP
PHP crypt()函数的用法讲解
2019/02/15 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
PHP底层运行机制与工作原理详解
2020/07/31 PHP
png在IE6 下无法透明的解决方法汇总
2015/05/21 Javascript
JavaSciprt中处理字符串之sup()方法的使用教程
2015/06/08 Javascript
jQuery实现鼠标经过事件的延时处理效果
2020/08/20 Javascript
javascript实现日期三级联动下拉框选择菜单
2020/12/03 Javascript
ES6中Math对象新增的方法实例详解
2017/04/25 Javascript
ES6新特性:使用export和import实现模块化详解
2017/07/31 Javascript
vue项目动态设置页面title及是否缓存页面的问题
2018/11/08 Javascript
详解微信小程序文件下载--视频和图片
2019/04/24 Javascript
一起写一个即插即用的Vue Loading插件实现
2019/10/31 Javascript
Vue实现图片与文字混输效果
2019/12/04 Javascript
微信小程序实现比较功能的方法汇总(五种方法)
2020/03/07 Javascript
微信小程序点击生成朋友圈分享图(遇到的坑)
2020/06/17 Javascript
Python多线程编程(七):使用Condition实现复杂同步
2015/04/05 Python
Python基于win32ui模块创建弹出式菜单示例
2018/05/09 Python
Django页面数据的缓存与使用的具体方法
2019/04/23 Python
Python利用pandas处理Excel数据的应用详解
2019/06/18 Python
python实现矩阵和array数组之间的转换
2019/11/29 Python
Tensorflow训练模型越来越慢的2种解决方案
2020/02/07 Python
python集合删除多种方法详解
2020/02/10 Python
python通过函数名调用函数的几种场景
2020/09/23 Python
如何利用Python 进行边缘检测
2020/10/14 Python
德国自然时尚和有机产品购物网站:Waschbär
2019/05/29 全球购物
酒店执行总经理岗位职责
2013/12/15 职场文书
《桃花心木》教学反思
2014/02/17 职场文书
高老头读书笔记
2015/06/30 职场文书
vue实现可以快进后退的跑马灯组件
2022/04/08 Vue.js