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模拟select,jselect的方法实现
Nov 08 Javascript
JS设置cookie、读取cookie、删除cookie
Apr 17 Javascript
详解JavaScript的while循环的使用
Jun 03 Javascript
jquery实现鼠标点击后展开列表内容的导航栏效果
Sep 14 Javascript
javascript中sort排序实例详解
Jul 24 Javascript
解析Javascript单例模式概念与实例
Dec 05 Javascript
jQuery 表单序列化实例代码
Jun 11 jQuery
JavaScript转换数据库DateTime字段类型方法
Jun 27 Javascript
node的process以及child_process模块学习笔记
Mar 06 Javascript
JavaScript使用享元模式实现文件上传优化操作示例
Aug 07 Javascript
vue实现移动端省市区选择
Sep 27 Javascript
使用uni-app开发微信小程序的实现
Dec 13 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 上传文件大小限制
2009/07/05 PHP
PHP学习笔记之一
2011/01/17 PHP
php 团购折扣计算公式
2011/11/24 PHP
基于Zend的Config机制的应用分析
2013/05/02 PHP
PHP flush()与ob_flush()的区别详解
2013/06/03 PHP
php时区转换转换函数
2014/01/07 PHP
PHP FileSystem 文件系统常用api整理总结
2019/07/12 PHP
YII2框架中actions的作用与使用方法示例
2020/03/13 PHP
JavaScript中instanceof运算符的使用示例
2016/06/08 Javascript
jQuery ajaxSubmit 实现ajax提交表单局部刷新
2016/07/04 Javascript
使用BootStrap实现用户登录界面UI
2016/08/10 Javascript
jQuery监听浏览器窗口大小的变化实例
2017/02/07 Javascript
详解用webpack2.0构建vue2.0超详细精简版
2017/04/05 Javascript
微信小程序中input标签详解及简单实例
2017/05/18 Javascript
微信小程序自定义toast实现方法详解【附demo源码下载】
2017/11/28 Javascript
jquery手机触屏滑动拼音字母城市选择器的实例代码
2017/12/11 jQuery
Angular动画实现的2种方式以及添加购物车动画实例代码
2018/08/09 Javascript
详解create-react-app 2.0版本如何启用装饰器语法
2018/10/23 Javascript
200行HTML+JavaScript实现年会抽奖程序
2019/01/22 Javascript
vuex实现数据状态持久化
2019/11/11 Javascript
vue中监听路由参数的变化及方法
2019/12/06 Javascript
在nodejs中创建child process的方法
2021/01/26 NodeJs
原生js 实现表单验证功能
2021/02/08 Javascript
[01:05:40]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第三场
2014/05/24 DOTA
用Python的线程来解决生产者消费问题的示例
2015/04/02 Python
利用python爬取散文网的文章实例教程
2017/06/18 Python
基于Django的python验证码(实例讲解)
2017/10/23 Python
python3.5+tesseract+adb实现西瓜视频或头脑王者辅助答题
2018/01/17 Python
Python cookbook(数据结构与算法)将名称映射到序列元素中的方法
2018/03/22 Python
深入浅析python with语句简介
2018/04/11 Python
python实现大学人员管理系统
2019/10/25 Python
消防安全管理制度
2014/02/01 职场文书
“三支一扶”支教教师思想汇报
2014/09/13 职场文书
部队2014年终工作总结
2014/11/27 职场文书
python实现图片九宫格分割的示例
2021/04/25 Python
Nginx工作模式及代理配置的使用细节
2022/03/21 Servers