JavaScript模拟实现继承的方法


Posted in Javascript onMarch 30, 2015

本文实例讲述了JavaScript模拟实现继承的方法。分享给大家供大家参考。具体分析如下:

我们都知道,在JavaScript中只能模拟实现OO中的"类",也就意味着,在JavaScript中没有类的继承。我们也只能通过在原对象里添加或改写属性来模拟实现。

先定义一个父类,

//父类
function ParentClass() {
 this.className = "ParentClass";
 this.auth = "Auth";
 this.version = "V1.0";
 this.parentClassInfo = function () {
 return this.className + "\n" + this.auth + "\n" + this.version;
 }
}

一、prototype 实现:

//子类
//1、prototype继承
function ChildClassByPrototype() {
 this.date = "2013-07-26";
 this.classInfo = function () {
  return this.parentClassInfo() + "\n" + this.date;
 }
}
ChildClassByPrototype.prototype = new ParentClass();
var cctest1 = new ChildClassByPrototype();
cctest1.parentClassInfo();
cctest1.classInfo();

这种方式很简单,只需把父类的实例赋值给子类的prototype属性就行了,然后子类就可以使用父亲的方法和属性了。这里其实是用到了原型链向上查找的特性,比如这个例子中的 cctest1.parentClassInfo() 方法,JavaScript会先在ChildClassByPrototype的实例中查找是否有parentClassInfo()方法,子类中没有,所以继续查找ChildClassByPrototype.prototype属性,而其prototype属性的值是ParentClass的一个实例,该实例有parentClassInfo()方法,于是查找结束,调用成功。

二、apply 实现:

//2、apply继承
function ChildClassByApply() {
 ParentClass.apply(this, new Array());
 //ParentClass.apply(this, []);
 this.date = "2013-07-26";
 this.classInfo = function () {
  return this.parentClassInfo() + "\n" + this.date;
 }
}

JavaScript中的apply可以理解为用A方法替换B方法,第一个参数为B方法的对象本身,第二个参数为一个数组,该数组内的值为需要传递给A方法对应的参数列表,如果参数为空,即没有参数传递,可通过 new Array()、[] 来传递。

三、call + prototype 实现:

//3、call+prototype继承
function ChildClassByCall() {
 ParentClass.call(this, arguments);
 this.date = "2013-07-26";
 this.classInfo = function () {
  return this.parentClassInfo() + "\n" + this.date;
 }
}
ChildClassByCall.prototype = new ParentClass();

call和apply作用类似,即都是用A方法替换B方法,只是传递的参数不一样,call方法的第一个参数为B方法的对象本身,后续的参数则不用Array包装,需直接依次进行传递。既然作用差不多,为何多了一句 原型赋值呢?这是因为call方法只实现了方法的替换而没有对对象属性进行复制操作。

每种方法都有其适用环境,比如,如果父类带有有参构造函数:

function ParentClass(className, auth, version) {
 this.className = className;
 this.auth = auth;
 this.version = version;
 this.parentClassInfo = function () {
 return this.className + "\n" + this.auth + "\n" + this.version;
 }
}

这种情况下,prototype就不适用了,可选用apply或call;

function ChildClassByApply(className, auth, version) {
 ParentClass.apply(this, [className, auth, version]);
 this.date = "2013-07-26";
 this.classInfo = function () {
  return this.parentClassInfo() + "\n" + this.date;
 }
}
function ChildClassByCall(className, auth, version) {
 ParentClass.call(this, arguments[0], arguments[1], arguments[2]);
 //ParentClass.call(this, className, auth, version);
 this.date = "2013-07-26";
 this.classInfo = function () {
  return this.parentClassInfo() + "\n" + this.date;
 }
}
ChildClassByCall.prototype = new ParentClass();

实例化:

var cctest2 = new ChildClassByApply("ParentClass", "Auth", "V1.0");
var cctest3 = new ChildClassByCall("ParentClass", "Auth", "V1.0");

在apply和call中,又该如何取舍呢?在OO的继承中,子类继承于父类,那么它应该也是父类的类型。即,ChildClassByCall、ChildClassByApply应该也是ParentClass类型,但我们用"instanceof"检测一下就会发现,通过apply继承的子类,并非ParentClass类型。所以,我们建议用call + prototype 来模拟实现继承。据说,Google Map API 的继承就是使用这种方式哟。

希望本文所述对大家的javascript程序设计有所帮助。

Javascript 相关文章推荐
javascript下IE与FF兼容函数收集
Sep 17 Javascript
javascript 进度条 实现代码
Jul 30 Javascript
js制作的鼠标悬浮时产生的下拉框效果
Oct 27 Javascript
原生Js页面滚动延迟加载图片实现原理及过程
Jun 24 Javascript
js生成动态表格并为每个单元格添加单击事件的方法
Apr 14 Javascript
JavaScript对象反射用法实例
Apr 17 Javascript
JQuery标签页效果的两个实例讲解(4)
Sep 17 Javascript
JS实现的最简Table选项卡效果
Oct 14 Javascript
前端构建工具之gulp的语法教程
Jun 12 Javascript
详解微信小程序-canvas绘制文字实现自动换行
Apr 26 Javascript
微信小程序官方动态自定义底部tabBar的例子
Sep 04 Javascript
JavaScript中关于预编译、作用域链和闭包的理解
Mar 31 Javascript
jQuery制作可自定义大小的拼图游戏
Mar 30 #Javascript
JS实现向表格中动态添加行的方法
Mar 30 #Javascript
JS实现向表格行添加新单元格的方法
Mar 30 #Javascript
JS实现控制表格行文本对齐的方法
Mar 30 #Javascript
JS实现控制表格行内容垂直对齐的方法
Mar 30 #Javascript
JS实现控制表格内指定单元格内容对齐的方法
Mar 30 #Javascript
JS实现控制表格单元格垂直对齐的方法
Mar 30 #Javascript
You might like
这东西价格,可以买几台TECSUN S-2000
2021/03/02 无线电
PHP实现利用MySQL保存session的方法
2014/08/23 PHP
Yii实现简单分页的方法
2016/04/29 PHP
laravel 配置路由 api和web定义的路由的区别详解
2019/09/03 PHP
修改Laravel自带的认证系统的User类的命名空间的步骤
2019/10/15 PHP
JS提交并解析后台返回的XML的代码
2008/11/03 Javascript
HTA版JSMin(省略修饰语若干)基于javascript语言编写
2009/12/24 Javascript
JavaScript NaN和Infinity特殊值 [译]
2012/09/20 Javascript
js 获取坐标 通过JS得到当前焦点(鼠标)的坐标属性
2013/01/04 Javascript
ExtJS4利根据登录后不同的角色分配不同的树形菜单
2014/05/02 Javascript
超炫的jquery仿flash导航栏特效
2014/11/11 Javascript
原生js制作简单的数字键盘
2015/04/24 Javascript
js实现每日自动换一张图片的方法
2015/05/04 Javascript
不依赖Flash和任何JS库实现文本复制与剪切附源码下载
2015/10/09 Javascript
JavaScript:Array类型全面解析
2016/05/19 Javascript
VUE实现日历组件功能
2017/03/13 Javascript
在Angular中使用JWT认证方法示例
2018/09/10 Javascript
weui中的picker使用js进行动态绑定数据问题
2019/11/06 Javascript
Python爬虫获取整个站点中的所有外部链接代码示例
2017/12/26 Python
Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】
2019/03/30 Python
Pyqt清空某一个QTreeewidgetItem下的所有分支方法
2019/06/17 Python
Django Docker容器化部署之Django-Docker本地部署
2019/10/09 Python
TensorFlow实现自定义Op方式
2020/02/04 Python
Django Serializer HiddenField隐藏字段实例
2020/03/31 Python
python 爬取腾讯视频评论的实现步骤
2021/02/18 Python
英国时尚家具、家居饰品及礼品商店:Graham & Green
2016/09/15 全球购物
极度干燥澳大利亚官方网站:Superdry澳大利亚
2019/03/28 全球购物
Java里面StringBuilder和StringBuffer有什么区别
2016/06/06 面试题
求职推荐信
2013/10/28 职场文书
学校献爱心活动总结
2014/07/08 职场文书
竞选班干部演讲稿400字
2014/08/20 职场文书
副校长个人对照检查材料思想汇报
2014/10/04 职场文书
学生党员批评与自我批评
2014/10/15 职场文书
2015年电信员工工作总结
2015/05/26 职场文书
教师学习中国梦心得体会
2016/01/05 职场文书
win10如何更改appdata文件夹的默认位置?
2022/07/15 数码科技