Javascript中3种实现继承的方法和代码实例


Posted in Javascript onAugust 12, 2014

继承是我们在实现面向对象编程的时候很重要的一个手段。虽然我们讲不能过度继承,多利用组合代替继承,但是继承总是免不了的。这里要讨论的就是Javascript中的继承机制。

Javascript中实际上是没有继承的概念的,但是我们可以通过一些手段来模仿实现它。这种继承实际上把一个对象复制到另外一个对象内部。你需要注意的是所有的本地类和宿主类是不能作为基类被继承的,主要是为了安全方面的考虑。

Javascript中的继承大约有三类:1.对象冒充;2.原型继承;3.二者的混合。

一、对象冒充

其实对象冒充是跟this关键字紧密联系在一起的(所以说充分理解Javascript中的this关键字是多么的重要:P)。构造函数使用this来给属性和方法赋值,而构造函数也可以看作为一个普通的函数,所以我们就可以使我们的基类的构造函数成为子类的构造函数,然后在子类的内部调用这个函数,那么子类就会得到父类的属性和方法。

原理很简单,那我们怎么实现呢?下面就以代码示例,实际的操作一下。

对象冒充实现方法一,我们最常用的新建对象的方法:

var classA = function(name){

 this.name = name;

 this.alertName = function(){

  alert(this.name);

 }

}

 

var classB = function(name,age){

 this.myConstructor = classA;

 this.myConstructor(name);

 delete this.myConstructor;

 

 this.age = age;

 this.alertAge = function(){

  alert(this.age);

 }

}

为了验证以上的方法是否正确,你可以亲自测试下,我将测试用的代码写在下面:

var objA = new classA('DK');

objA.alertName();//DK

 

var objB = new classB('DS',20);

 

objB.alertName();//DS

objB.alertAge();//20

这就是所谓的对象冒充了,另外对象冒充还有另外两种实现的方式,虽然它们的实现手段不一样,但是它们的原理是一样的。

对象冒充实现方法二,使用call方法:

var classA = function(name){

 this.name = name;

 this.alertName = function(){

  alert(this.name);

 }

}

 

var classB = function(name,age){

 classA.call(this,name);

 

 this.age = age;

 this.alertAge = function(){

  alert(this.age);

 }

}

通过代码也能看出来,第一种方法中我们新建了函数指针指向父类,调用函数,然后将指针删除。而这里我们之间用call方法在this对象下面运行父类的构造函数,实现了同样的目的。另外与call方法相对于的则就是apply方法啦。

对象冒充实现方法三,使用apply方法:

var classA = function(name){

 this.name = name;

 this.alertName = function(){

  alert(this.name);

 }

}

 

var classB = function(name,age){

 classA.apply(this,new Array(name));

 

 this.age = age;

 this.alertAge = function(){

  alert(this.age);

 }

}

其实大家可以看到,apply方法跟call方法是非常类似的,只不过传递参数是略有不同罢了。

二、原型继承

大家应该对prototype对象有所了解,原型对象上的所有属性和方法将被传递给类的所有实例,所有当我们把父类的所有属性和方法付给子类的prototype对象时也就相当于实现了我们的继承。

子类想获得父类的所有属性和方法,那我们将父类的一个实例直接付给子类的prototype对象,那我们的子类不就相当于获取了父类的所有对象和方法?

代码示例伺候:

var classA = function(){

 this.name = 'DK';

 this.alertName = function(){

  alert(this.name);

 }

}

 

var classB = function(name,age){

 this.name = name;

 this.age = age;

}

 

classB.prototype = new classA();

 

classB.prototype.alertAge = function(){

 alert(this.age);

}

注意这里的父类的构造函数需要确保没有参数。因为即使有构造参数在实现原型继承的时候你也无法传递=.=!

三、混合继承

顾名思义,混合继承就是前两种方式的混合使用了。

var classA = function(name){

 this.name = name;

}

 

classA.prototype.alertName = function(){

 alert(this.name);

}

 

var classB = function(name,age){

 classA.call(this,name);

 this.age = age;

}

 

classB.prototype = new classA();

 

classB.prototype.alertAge = function(){

 alert(this.age);

}

使用对象冒充实现了向父类传递参数,同时使用原型继承实现了对公有方法的继承。

说完了这三中继承方式了,下面该说到问题的时候了。

你可能会不解,为什么有了对象冒充,有了原型继承还要再弄出个什么混合继承,对,最重要的也就是这个问题。

1.如果你实际测试一下,你会发现通过对象冒充的方式实现的继承,子类是无法访问到父类的原型链上的方法的。

2.而用原型继承,则会把所有的属性变成共享的属性,如果你同一个子类实现两个实例,你会发现你的所有实例共享所有的属性。

3.但是这肯定是不合适的了。所以就有了混合继承的方式,让属性继续保持私有,同时让子类能够访问父类的原型链的方法。

你可以亲自动手试一下,在对象冒充继承的时候,子类无法访问父类的原型链方法,原型链继承子类的所有实例共享所有父类属性。这里我就不写例子了。

Javascript 相关文章推荐
js去除空格的12种实用方法
Nov 08 Javascript
详解JavaScript语法对{}处理的坑爹之处
Jun 05 Javascript
让IE8浏览器支持function.bind()方法
Oct 16 Javascript
纯javascript移动优先的幻灯片效果
Nov 02 Javascript
学习JavaScript设计模式(代理模式)
Dec 03 Javascript
使用jQuery.form.js/springmvc框架实现文件上传功能
May 12 Javascript
JavaScript制作弹出层效果
Dec 02 Javascript
JavaScript实现简单精致的图片左右无缝滚动效果
Mar 16 Javascript
Swiper实现轮播图效果
Jul 03 Javascript
微信小程序页面生命周期详解
Jan 31 Javascript
vue实现动态添加数据滚动条自动滚动到底部的示例代码
Jul 06 Javascript
Web安全之XSS攻击与防御小结
Dec 13 Javascript
jQuery判断checkbox是否选中的3种方法
Aug 12 #Javascript
jquery判断浏览器后退时候弹出消息的方法
Aug 11 #Javascript
jQuery根据ID获取input、checkbox、radio、select的示例
Aug 11 #Javascript
JavaScript中跨域调用Flash的方法
Aug 11 #Javascript
jQuery实现的一个自定义Placeholder属性插件
Aug 11 #Javascript
javascript中解析四则运算表达式的算法和示例
Aug 11 #Javascript
javascript实现的平方米、亩、公顷单位换算小程序
Aug 11 #Javascript
You might like
国外十大最流行的PHP框架排名
2013/07/04 PHP
析构函数与php的垃圾回收机制详解
2013/10/28 PHP
php数组随机排序实现方法
2015/06/13 PHP
dvwa+xampp搭建显示乱码的问题及解决方案
2015/08/23 PHP
利用php_imagick实现复古效果的方法
2016/10/18 PHP
学习javascript,实现插入排序实现代码
2011/07/31 Javascript
JS中处理与当前时间间隔的函数代码
2012/05/23 Javascript
利用jquery.qrcode在页面上生成二维码且支持中文
2014/02/12 Javascript
jquery表单对象属性过滤选择器实例分析
2015/05/18 Javascript
原生javascript 学习之js变量全面了解
2016/07/14 Javascript
angularjs 源码解析之injector
2016/08/22 Javascript
jQuery简单实现中间浮窗效果
2016/09/04 Javascript
阿里云ecs服务器中安装部署node.js的步骤
2016/10/08 Javascript
jQuery实现jQuery-form.js实现异步上传文件
2017/04/28 jQuery
D3.js进阶系列之CSV表格文件的读取详解
2017/06/06 Javascript
Bootstrap 模态框(Modal)带参数传值实例
2017/08/20 Javascript
Layui table 组件的使用之初始化加载数据、数据刷新表格、传参数
2017/09/11 Javascript
vue Element-ui input 远程搜索与修改建议显示模版的示例代码
2017/10/19 Javascript
jQuery实现的简单前端搜索功能示例
2017/10/28 jQuery
vue-cli构建项目下使用微信分享功能
2018/05/28 Javascript
一秒学会微信小程序制作table表格
2019/02/14 Javascript
CKEditor 4.4.1 添加代码高亮显示插件功能教程【使用官方推荐Code Snippet插件】
2019/06/14 Javascript
layer.open的自适应及居中及子页面标题的修改方法
2019/09/05 Javascript
Layui动态生成select下拉选择框不显示的解决方法
2019/09/24 Javascript
Python 包含汉字的文件读写之每行末尾加上特定字符
2016/12/12 Python
Python自然语言处理 NLTK 库用法入门教程【经典】
2018/06/26 Python
基于pytorch 预训练的词向量用法详解
2020/01/06 Python
Python使用tkinter制作在线翻译软件
2021/02/22 Python
7款设计巧妙的css3飘带状3D立体效果的导航菜单和表单窗口
2013/02/04 HTML / CSS
video实现有声音自动播放的实现方法
2020/05/20 HTML / CSS
英国在线定做百叶窗网站:Make My Blinds
2020/08/17 全球购物
函授大专自我鉴定
2013/11/01 职场文书
幼儿教师工作感言
2014/02/14 职场文书
双创工作实施方案
2014/03/26 职场文书
详解Nginx 被动检查服务器的存活状态
2021/10/16 Servers
搭建zabbix监控以及邮件报警的超级详细教学
2022/07/15 Servers