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 相关文章推荐
收藏一些不常用,但是有用的代码
Mar 12 Javascript
js multiple全选与取消全选实现代码
Dec 04 Javascript
SuperSlide2实现图片滚动特效
Jun 20 Javascript
整理Javascript流程控制语句学习笔记
Nov 29 Javascript
Javascript iframe交互并兼容各种浏览器的解决方法
Jul 12 Javascript
微信小程序swiper组件用法实例分析【附源码下载】
Dec 07 Javascript
JavaScript类数组对象转换为数组对象的方法实例分析
Jul 24 Javascript
JS的Ajax与后端交互数据的实例
Aug 08 Javascript
用npm安装vue和vue-cli,并使用webpack创建项目的方法
Sep 28 Javascript
从零开始用electron手撸一个截屏工具的示例代码
Oct 10 Javascript
JQuery事件委托原理与用法实例分析
May 13 jQuery
JavaScript实现手机号码 3-4-4格式并控制新增和删除时光标的位置
Jun 02 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
全国FM电台频率大全 - 4 山西省
2020/03/11 无线电
phpmyadmin 访问被拒绝的真实原因
2009/06/15 PHP
php使用PDO操作MySQL数据库实例
2014/12/30 PHP
PHP获取数组最后一个值的2种方法
2015/01/21 PHP
PHP 7安装使用体验之性能大提升,兼容性强,扩展支持不够(升级PHP要谨慎)
2017/07/27 PHP
页面中iframe相互传值传参
2009/12/13 Javascript
一个网马的tips实现分析
2010/11/28 Javascript
html+css+js实现xp window界面及有关功能
2013/03/26 Javascript
javascript中为某个元素指定事件的三种方式
2014/08/07 Javascript
Jquery中map函数的用法
2016/06/03 Javascript
jQuery实现动态文字搜索功能
2017/01/05 Javascript
详解Angular 开发环境搭建
2017/06/22 Javascript
webpack之devtool详解
2018/02/10 Javascript
jQuery实现模糊搜索功能的方法分析
2018/06/29 jQuery
ajax与jsonp的区别及用法
2018/10/16 Javascript
详解vue 自定义marquee无缝滚动组件
2019/04/09 Javascript
微信小程序保持session会话的方法
2020/03/20 Javascript
js实现小球在页面规定的区域运动
2020/06/16 Javascript
[04:00]DOTA2解说界神雕侠侣 CJ第四天谷子现场过生日
2013/07/30 DOTA
在Linux下调试Python代码的各种方法
2015/04/17 Python
使用Anaconda3建立虚拟独立的python2.7环境方法
2018/06/11 Python
python生成以及打开json、csv和txt文件的实例
2018/11/16 Python
django配置连接数据库及原生sql语句的使用方法
2019/03/03 Python
Django REST Framework序列化外键获取外键的值方法
2019/07/26 Python
基于python解线性矩阵方程(numpy中的matrix类)
2019/10/21 Python
django在保存图像的同时压缩图像示例代码详解
2020/02/11 Python
python实现将列表中各个值快速赋值给多个变量
2020/04/02 Python
M1芯片安装python3.9.1的实现
2021/02/02 Python
Python将QQ聊天记录生成词云的示例代码
2021/02/10 Python
英国历史最悠久的DJ设备供应商:DJ Finance、DJ Warehouse、The DJ Shop
2019/09/04 全球购物
小学生新年寄语
2014/04/03 职场文书
售后服务承诺书模板
2014/05/21 职场文书
个人房屋买卖协议书(范本)
2014/10/04 职场文书
2016新年慰问信范文
2015/03/25 职场文书
公司总经理岗位职责
2015/04/01 职场文书
幼儿园教师师德承诺书
2015/04/28 职场文书