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 TextArea动态显示剩余字符
Oct 22 Javascript
JavaScript入门教程(7) History历史对象
Jan 31 Javascript
让图片旋转任意角度及JQuery插件使用介绍
Mar 20 Javascript
JS中如何设置readOnly的值
Dec 25 Javascript
日常收集整理的JavaScript常用函数方法
Dec 10 Javascript
微信小程序  TLS 版本必须大于等于1.2问题解决
Feb 22 Javascript
详解React Native网络请求fetch简单封装
Aug 10 Javascript
用最少的JS代码写出贪吃蛇游戏
Jan 12 Javascript
使用Node搭建reactSSR服务端渲染架构
Aug 30 Javascript
说说Vuex的getters属性的具体用法
Apr 15 Javascript
Vue Element校验validate的实例
Sep 21 Javascript
解决vue项目打包上服务器显示404错误,本地没出错的问题
Nov 03 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
基于simple_html_dom的使用小结
2013/07/01 PHP
PHP函数之日期时间函数date()使用详解
2013/09/09 PHP
php自动加载autoload机制示例分享
2014/02/20 PHP
PHP向socket服务器收发数据的方法
2015/01/24 PHP
PHP实现的回溯算法示例
2017/08/15 PHP
js保存当前路径(cookies记录)
2010/12/14 Javascript
jquery一句话全选/取消全选
2011/03/01 Javascript
JS实现匀速运动的代码实例
2013/11/29 Javascript
JQuery实现鼠标移动到图片上显示边框效果
2014/01/09 Javascript
JS仿Windows开机启动Loading进度条的方法
2015/02/26 Javascript
js获取当前日期时间及其它操作汇总
2015/04/17 Javascript
Css3制作变形与动画效果
2015/07/24 Javascript
Jquery幻灯片特效代码分享--打开页面随机选择切换方式(3)
2015/08/15 Javascript
深入浅析JavaScript中的constructor
2016/04/19 Javascript
JQuery属性操作与循环用法示例
2019/05/15 jQuery
基于原生js实现九宫格算法代码实例
2020/07/03 Javascript
关于angular引入ng-zorro的问题浅析
2020/09/09 Javascript
[04:00]DOTA2解说界神雕侠侣 CJ第四天谷子现场过生日
2013/07/30 DOTA
[02:11]2014DOTA2 TI专访VG战队Fenrir:队伍气氛良好
2014/07/11 DOTA
Python中列表与元组的乘法操作示例
2018/02/10 Python
Python+request+unittest实现接口测试框架集成实例
2018/03/16 Python
Python实现将json文件中向量写入Excel的方法
2018/03/26 Python
Python实现将通信达.day文件读取为DataFrame
2018/12/22 Python
Python3最长回文子串算法示例
2019/03/04 Python
python 基于PYMYSQL使用MYSQL数据库
2020/12/24 Python
python 对xml解析的示例
2021/02/27 Python
详解css3 object-fit属性
2018/07/27 HTML / CSS
详解CSS3弹性伸缩盒
2020/09/21 HTML / CSS
世界排名第一的万圣节服装店:Spirit Halloween
2018/10/16 全球购物
Elizabeth Gage官网:英国最好的珠宝设计之一
2020/09/26 全球购物
基层党支部公开承诺书
2014/05/29 职场文书
创建绿色社区汇报材料
2014/08/22 职场文书
师德师风自我剖析材料
2014/09/27 职场文书
政风行风建设整改方案
2014/10/27 职场文书
2016党员入党决心书
2015/09/22 职场文书
Java 深入探究讲解简单工厂模式
2022/04/07 Java/Android