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 窗口加载蒙板 内嵌网页内容
Nov 19 Javascript
GreyBox技术总结(转)
Nov 23 Javascript
原生js 秒表实现代码
Jul 24 Javascript
Jquery插件编写简明教程
Mar 25 Javascript
采用自执行的匿名函数解决for循环使用闭包的问题
Sep 11 Javascript
jQuery插件简单实现方法
Jul 18 Javascript
jquery.form.js框架实现文件上传功能案例解析(springmvc)
May 26 Javascript
[js高手之路]原型式继承与寄生式继承详解
Aug 28 Javascript
JS获取动态添加元素的方法详解
Jul 31 Javascript
在node环境下parse Smarty模板的使用示例代码
Nov 15 Javascript
VueCli4项目配置反向代理proxy的方法步骤
May 17 Javascript
JavaScript canvas实现文字时钟
Jan 10 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
PHP开发文件系统实例讲解
2006/10/09 PHP
在 PHP 中使用随机数的三个步骤
2006/10/09 PHP
用PHP和ACCESS写聊天室(六)
2006/10/09 PHP
CodeIgniter框架数据库事务处理的设计缺陷和解决方案
2014/07/25 PHP
WordPress主题制作之模板文件的引入方法
2015/12/28 PHP
PHP之十六个魔术方法详细介绍
2016/11/01 PHP
js 跨域和ajax 跨域问题小结
2009/07/01 Javascript
使用jQuery的ajax功能实现的RSS Reader 代码
2009/09/03 Javascript
node.js中的events.emitter.removeAllListeners方法使用说明
2014/12/10 Javascript
JavaScript的RequireJS库入门指南
2015/07/01 Javascript
浅谈JavaScript中的string拥有方法的原因
2015/08/28 Javascript
第五篇Bootstrap 排版
2016/06/21 Javascript
纯javascript版日历控件
2016/11/24 Javascript
利用node.js搭建简单web服务器的方法教程
2017/02/20 Javascript
使用 electron 实现类似新版 QQ 的登录界面效果(阴影、背景动画、窗体3D翻转)
2018/10/23 Javascript
微信公众号H5支付接口调用方法
2019/01/10 Javascript
javaScript 实现重复输出给定的字符串的常用方法小结
2020/02/20 Javascript
微信h5静默和非静默授权获取用户openId的方法和步骤
2020/06/08 Javascript
nodejs中使用worker_threads来创建新的线程的方法
2021/01/22 NodeJs
python基础教程之元组操作使用详解
2014/03/25 Python
python实现的登录和操作开心网脚本分享
2014/07/09 Python
Python实现将罗马数字转换成普通阿拉伯数字的方法
2017/04/19 Python
python一行sql太长折成多行并且有多个参数的方法
2018/07/19 Python
Python使用pyshp库读取shapefile信息的方法
2018/12/29 Python
django的settings中设置中文支持的实现
2019/04/28 Python
实现Python3数组旋转的3种算法实例
2020/09/16 Python
css3 给背景设置渐变色的方法
2019/09/12 HTML / CSS
世界首屈一指的钓鱼用品商店:TackleDirect
2016/07/26 全球购物
香港卓悦化妆品官网:BONJOUR
2017/09/21 全球购物
The North Face北面法国官网:美国著名户外品牌
2019/11/01 全球购物
美国职棒大联盟的官方手套、球和头盔:Rawlings
2020/02/15 全球购物
面试后的英文感谢信
2014/02/01 职场文书
客户答谢会活动方案
2014/08/31 职场文书
文体活动总结
2015/02/04 职场文书
大学生就业意向书
2015/05/11 职场文书
HTML实现仿Windows桌面主题特效的实现
2022/06/28 HTML / CSS