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 相关文章推荐
网页中返回顶部代码(多种方法)另附注释说明
Apr 24 Javascript
chrome下jq width()方法取值为0的解决方法
May 26 Javascript
JavaScript字符串对象substring方法入门实例(用于截取字符串)
Oct 17 Javascript
PHP中使用微秒计算脚本执行时间例子
Nov 19 Javascript
JS打字效果的动态菜单代码分享
Aug 21 Javascript
基于jQuery的AJAX和JSON实现纯html数据模板
Aug 09 Javascript
深入浅析jQuery对象$.html
Aug 22 Javascript
如何提高数据访问速度
Dec 26 Javascript
JS原生数据双向绑定实现代码
Aug 14 Javascript
Vue+ElementUI实现表单动态渲染、可视化配置的方法
Mar 07 Javascript
JS如何获取地址栏的参数实例讲解
Oct 06 Javascript
详解react native页面间传递数据的几种方式
Nov 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获取url参数方法总结
2014/11/13 PHP
PHP递归获取目录内所有文件的实现方法
2016/11/01 PHP
解决安装WampServer时提示缺少msvcr110.dll文件的问题
2017/07/09 PHP
PHP观察者模式示例【Laravel框架中有用到】
2018/06/15 PHP
php使用redis的有序集合zset实现延迟队列应用示例
2020/02/20 PHP
如何在PHP中使用AES加密算法加密数据
2020/06/24 PHP
PHP获取php,mysql,apche的版本信息及更多服务器信息
2021/03/09 PHP
JQuery 选项卡效果(JS与HTML的分离)
2010/04/01 Javascript
Jquery实现弹出层分享微博插件具备动画效果
2013/04/03 Javascript
node.js中的fs.writeFileSync方法使用说明
2014/12/14 Javascript
js面向对象之公有、私有、静态属性和方法详解
2015/04/17 Javascript
图文详解JavaScript的原型对象及原型链
2016/08/02 Javascript
JS+CSS3模拟溢出滚动效果
2016/08/12 Javascript
Jquery Easyui日历组件Calender使用详解(23)
2016/12/18 Javascript
AngularJS实现网站换肤实例
2021/02/19 Javascript
Angular6 用户自定义标签开发的实现方法
2019/01/08 Javascript
vscode调试node.js的实现方法
2020/03/22 Javascript
Node.js API详解之 repl模块用法实例分析
2020/05/25 Javascript
json.stringify()与json.parse()的区别以及用处
2021/01/25 Javascript
[02:50]【扭转乾坤,只此一招】DOTA2全新版本永雾林渊开启新篇章
2020/12/24 DOTA
将Django使用的数据库从MySQL迁移到PostgreSQL的教程
2015/04/11 Python
Python可变参数函数用法实例
2015/07/07 Python
Django关于admin的使用技巧和知识点
2020/02/10 Python
详解CSS3中字体平滑处理和抗锯齿渲染
2017/03/29 HTML / CSS
HTML5注册表单的自动聚焦与占位文本示例代码
2013/07/19 HTML / CSS
struct和class的区别
2015/11/20 面试题
机电一体化专业应届本科生求职信
2013/09/27 职场文书
商务助理岗位职责
2013/11/13 职场文书
迟到检讨书800字
2014/01/13 职场文书
弘扬职业精神演讲稿
2014/03/20 职场文书
2014年领班工作总结
2014/11/25 职场文书
个性发展自我评价2015
2015/03/09 职场文书
参加招聘会后的感想
2015/08/10 职场文书
《坐井观天》教学反思
2016/02/18 职场文书
用CSS3画一个爱心
2021/04/27 HTML / CSS
mysql分表之后如何平滑上线详解
2021/11/01 MySQL