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 相关文章推荐
HTML页面如何象ASP一样接受参数
Feb 07 Javascript
raphael.js绘制中国地图 地图绘制方法
Feb 12 Javascript
javascript实现英文首字母大写
Apr 23 Javascript
jQuery多条件筛选如何实现
Nov 04 Javascript
JavaScript实现时间倒计时跳转(推荐)
Jun 28 Javascript
再谈javascript注入 黑客必备!
Sep 14 Javascript
JQuery实现DIV其他动画效果的简单实例
Sep 18 Javascript
Vim快速合并行及vim 将文件所有行合并到一行
Nov 27 Javascript
JavaScript实现二叉树定义、遍历及查找的方法详解
Dec 20 Javascript
vue系列之requireJs中引入vue-router的方法
Jul 18 Javascript
微信小程序自定义组件传值 页面和组件相互传数据操作示例
May 05 Javascript
OpenLayers3实现地图鹰眼以及地图比例尺的添加
Sep 25 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
《魔兽争霸3:重制版》更新 多项视觉效果调整
2020/05/04 魔兽争霸
php 三维饼图的实现代码
2008/09/28 PHP
PHP全概率运算函数(优化版) Webgame开发必备
2011/07/04 PHP
Apache连接PHP后无法启动问题解决思路
2015/06/18 PHP
php自定义函数实现二维数组排序功能
2016/07/20 PHP
Yii使用DbTarget实现日志功能的示例代码
2020/07/21 PHP
Mootools 1.2教程 排序类和方法简介
2009/09/15 Javascript
JS window.opener返回父页面的应用
2009/10/24 Javascript
Ajax 数据请求的简单分析
2011/04/05 Javascript
JavaScript中链式调用之研习
2011/04/07 Javascript
兼容IE、FireFox、Chrome等浏览器的xml处理函数js代码
2011/11/30 Javascript
解决遍历时Array.indexOf产生的性能问题
2012/07/03 Javascript
js设置cookie过期及清除浏览器对应名称的cookie
2013/10/24 Javascript
现代 JavaScript 开发编程风格Idiomatic.js指南中文版
2014/05/28 Javascript
原生js实现fadein 和 fadeout淡入淡出效果
2014/06/05 Javascript
20条学习javascript的编程规范的建议
2014/11/28 Javascript
JS实现IE状态栏文字缩放效果代码
2015/10/24 Javascript
canvas雪花效果核心代码分享
2017/02/19 Javascript
在node.js中怎么屏蔽掉favicon.ico的请求
2017/03/01 Javascript
JS实现动态给标签控件添加事件的方法示例
2017/05/13 Javascript
Bootstrap 3多级下拉菜单实例
2017/11/23 Javascript
详解在微信小程序的JS脚本中使用Promise来优化函数处理
2019/03/06 Javascript
Vue父组件监听子组件生命周期
2020/09/03 Javascript
Python3 入门教程 简单但比较不错
2009/11/29 Python
Python3爬虫学习之爬虫利器Beautiful Soup用法分析
2018/12/12 Python
python实现祝福弹窗效果
2019/04/07 Python
Python3+Pycharm+PyQt5环境搭建步骤图文详解
2019/05/29 Python
如何在Canvas上的图形/图像绑定事件监听的实现
2020/09/16 HTML / CSS
华纳兄弟工作室的官方授权商店:WB Shop
2018/11/30 全球购物
木马的传播途径主要有哪些
2016/04/08 面试题
护理专业自荐信范文
2014/02/26 职场文书
《花木兰》教学反思
2014/04/09 职场文书
4s店市场专员岗位职责
2014/04/09 职场文书
环境工程专业毕业生求职信
2014/09/30 职场文书
python 多态 协议 鸭子类型详解
2021/11/27 Python
vue cli4中mockjs在dev环境和build环境的配置详情
2022/04/06 Vue.js