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 对象比较实现代码
Apr 27 Javascript
javascript的parseFloat()方法精度问题探讨
Nov 26 Javascript
JavaScript中使用arguments获得函数传参个数实例
Aug 27 Javascript
jQuery中unbind()方法用法实例
Jan 19 Javascript
使用bootstrap3开发响应式网站
May 12 Javascript
15个值得开发人员关注的jQuery开发技巧和心得总结【经典收藏】
May 25 Javascript
js实现动态显示时间效果
Mar 06 Javascript
BootStrap的双日历时间控件使用
Jul 25 Javascript
JavaScript 异步调用
Oct 25 Javascript
在Vue中使用echarts的方法
Feb 05 Javascript
js脚本中执行java后台代码方法解析
Oct 11 Javascript
详解Vue的sync修饰符
May 15 Vue.js
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
如何在smarty中增加类似foreach的功能自动加载数据
2013/06/26 PHP
简单谈谈php中ob_flush和flush的区别
2014/11/27 PHP
PHP生成指定随机字符串的简单实现方法
2015/04/01 PHP
php实现阿拉伯数字和罗马数字相互转换的方法
2015/04/17 PHP
详解WordPress中的头像缓存和代理中的缓存更新方法
2016/03/01 PHP
php-msf源码详解
2017/12/25 PHP
在 PHP 和 Laravel 中使用 Traits的方法
2019/11/13 PHP
php中加密解密DES类的简单使用方法示例
2020/03/26 PHP
js 发个判断字符串是否为符合标准的函数
2009/04/27 Javascript
JavaScript新窗口与子窗口传值详解
2014/02/11 Javascript
nodejs的10个性能优化技巧
2014/07/15 NodeJs
jQuery中(function($){})(jQuery)详解
2015/07/15 Javascript
jQuery实现布局高宽自适应的简单实例
2016/05/28 Javascript
Bootstrap实现圆角、圆形头像和响应式图片
2016/12/14 Javascript
addEventListener()与removeEventListener()解析
2017/04/20 Javascript
javascript移动端 电子书 翻页效果实现代码
2019/09/07 Javascript
Vue.js的模板语法详解
2020/02/16 Javascript
Vue select 绑定动态变量的实例讲解
2020/10/22 Javascript
[00:36]DOTA2风云人物相约完美“圣”典 12月17日不见不散
2016/11/30 DOTA
Python中Scrapy爬虫图片处理详解
2017/11/29 Python
python实现自动发送报警监控邮件
2018/06/21 Python
python爬虫 2019中国好声音评论爬取过程解析
2019/08/26 Python
Python 3.6打包成EXE可执行程序的实现
2019/10/18 Python
django2.2 和 PyMySQL版本兼容问题
2020/02/17 Python
Python post请求实现代码实例
2020/02/28 Python
Python3.9 beta2版本发布了,看看这7个新的PEP都是什么
2020/06/10 Python
利用python实现后端写网页(flask框架)
2021/02/28 Python
国庆节文艺活动方案
2014/02/03 职场文书
挖掘机司机岗位职责
2014/02/12 职场文书
爱心活动计划书
2014/04/26 职场文书
妇女干部培训方案
2014/05/12 职场文书
装修活动策划方案
2014/08/27 职场文书
党员干部形式主义个人整改措施
2014/09/17 职场文书
2014年社区妇联工作总结
2014/12/02 职场文书
幼儿园中班班级总结
2015/08/10 职场文书
python Polars库的使用简介
2021/04/21 Python