Javascript玩转继承(二)


Posted in Javascript onMay 08, 2014

毋庸置疑,这种方式是比较容易理解的,在子类中调用父类的构造函数。另外,这种方法最大的一个优点就是说构造继承可以实现多继承,复习下这个代码:

function A()
{    }
function B()
{    }
function C()
{
    this.father=A;
    this.father();
    delete this.father;
    this.father=B;
    this.father();
    delete this.father;
}

但是这种方式也有着这样和那样的缺点:
熟悉面向对象的我们来看这样一段C#代码:

classProgram
{
staticvoid Main(string[] args)
{
B b=newB();
bool temp = (typeof(A)).IsInstanceOfType(b);
Console.WriteLine(temp);
}
}
classA
{
public A()
{ }
}
classB : A
{
public B()
{ 
}
}

结果呢?b当然是A的一个实例:

Javascript玩转继承(二)

然而我们对上面的那段使用构造继承的Javascript代码做这样的测试:

function A()
{    }
function B()
{    }
function C()
{
    this.father=A;
    this.father();
    delete this.father;
    this.father=B;
    this.father();
    delete this.father;
}
var c=new C();
alert(c instanceof A);

可是得到的结果却不是我们想象的那样:

Javascript玩转继承(二)

其实很容易解释:构造继承只是通过了调用父类的构造方法复制的父类的属性,其他的什么搜没有做,所以很多资料中并不把这种继承方式称做继承。

看到缺点的同时也记住优点:支持多继承。

我们看C# 的继承,发现与这个继承有两个最典型的不同:C#不支持多继承,以及我上面提到的构造继承的缺点。于是就产生了一种新的继承方式,我们成为原型继承。

看到名字,可以大致理解,原型继承就是使用原型(prototype)的特性来实现继承的。这是在Javascript最流行的一种继承方式。如果对原型有不理解,请关注我的另一篇文章:《玩转原型——prototype》。
我们先来看代码,在这里,我借鉴《Javascript王者归来》中的一段代码:

function Point(dimension)
{
        this.dimension=dimension;
        this.Test=function(){
            alert("Success");
}
}
function Point2D(x,y)
{
        this.x=x;
        this.y=y;
}
Point2D.prototype=new Point(2);
var p=new Point2D(3,4);
p.Test();

Javascript玩转继承(二)

测试通过。说明Point2D已经继承了父类的方法,再看看instance。

alert(p instanceof Point);

Javascript玩转继承(二)

成功!好,我们来分析下原型继承:

原型继承的优点我不再多说,结构简单,容易理解,而且可以instance。但是他的缺点同样显著,还记得我上一篇关于Animal,People,Girl的例子么?我们用原型继承来实现下:

function Animal() 
{ 
this.Run=function(){alert("I can run");}; 
} 
function People(name) 
{ 
this.Say=function(){alert("My name is "+this.name);} 
} 
People.prototype=new Animal();
function Girl(name,age) 
{ 
this.age=age; 
this.Introduce=function(){alert("My name is "+this.name+".I am "+this.age);}; 
}
Girl.prototype=new People(???);

大家注意看我红色加粗部分的那行代码,People是Girl的原型,那么我们在初始化People的时候就应该传入name参数,但是每个Girl的名字是不一样的,所以原型继承不使用的场合一:在原型继承阶段你不能确定用什么参数来初始化父类对象。场合二:很简单,每一个类只能有一个原型,那么也就是说,原型继承不能用于多继承。这是件好事,也是件坏事。因为:
在Java和C#等面向对象语言中,本来就不支持多继承,并且认为多继承是不符合面向对象的

无法实现多个接口了!

好了,今天就写到这,总结下,Prototype继承解决了构造继承的一些问题,又引入了一些新的问题。总体来说,原型继承是应用最广泛的继承方式,也是Javascript文法中真正意思上实现继承的方式!

Javascript 相关文章推荐
escape、encodeURI、encodeURIComponent等方法的区别比较
Dec 27 Javascript
DIV+CSS+JS不间断横向滚动实现代码
Mar 19 Javascript
javascript中的if语句使用介绍
Nov 20 Javascript
javascript获取四位数字或者字母的随机数
Jan 09 Javascript
JQuery实现级联下拉框效果实例讲解
Sep 17 Javascript
Bootstrap每天必学之导航组件
Apr 25 Javascript
Web前端框架bootstrap实战【第一次接触使用】
Dec 28 Javascript
jQuery DateTimePicker 日期和时间插件示例
Jan 22 Javascript
详解Node.js项目APM监控之New Relic
May 12 Javascript
微信小程序实现简单表格
Feb 14 Javascript
ES6顶层对象、global对象实例分析
Jun 14 Javascript
javascript+css实现俄罗斯方块小游戏
Jun 28 Javascript
js的Prototype属性解释及常用方法
May 08 #Javascript
Javascript玩转继承(一)
May 08 #Javascript
玩转方法:call和apply
May 08 #Javascript
jQuery产品间断向下滚动效果核心代码
May 08 #Javascript
jQuery.extend()、jQuery.fn.extend()扩展方法示例详解
May 08 #Javascript
jquery通过visible来判断标签是否显示或隐藏
May 08 #Javascript
setInterval计时器不准的问题解决方法
May 08 #Javascript
You might like
require(),include(),require_once()和include_once()的异同
2007/01/02 PHP
PHP的一个基础知识 表单提交
2011/07/04 PHP
thinkPHP统计排行与分页显示功能示例
2016/12/02 PHP
JavaScript 数组的 uniq 方法
2008/01/23 Javascript
对xmlHttp对象方法和属性的理解
2011/01/17 Javascript
JavaScript DOM事件(笔记)
2015/04/08 Javascript
BootStrap Progressbar 实现大文件上传的进度条的实例代码
2016/06/27 Javascript
js实现目录链接,内容跟着目录滚动显示的简单实例
2016/10/15 Javascript
微信小程序 富文本转文本实例详解
2016/10/24 Javascript
详解Nuxt.js部署及踩过的坑
2018/08/07 Javascript
详解小程序循环require之坑
2019/03/08 Javascript
js尾调用优化的实现
2019/05/23 Javascript
Vue事件修饰符native、self示例详解
2019/07/09 Javascript
[01:09:50]VP vs Pain 2018国际邀请赛小组赛BO2 第二场
2018/08/20 DOTA
[01:32:50]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第一场 1月25日
2021/03/11 DOTA
Python使用matplotlib绘制随机漫步图
2018/08/27 Python
Python爬取商家联系电话以及各种数据的方法
2018/11/10 Python
python 日志模块 日志等级设置失效的解决方案
2020/05/26 Python
python 实现关联规则算法Apriori的示例
2020/09/30 Python
加拿大健康、婴儿和美容产品在线购物:Well.ca
2016/11/30 全球购物
GIVENCHY纪梵希官方旗舰店:高定彩妆与贵族护肤品
2018/04/16 全球购物
德国网上超市:myTime.de
2019/08/26 全球购物
Java程序员面试题
2016/09/27 面试题
J2EE面试题
2016/03/14 面试题
应届生求职推荐信
2013/10/28 职场文书
重阳节登山活动方案
2014/02/03 职场文书
大学军训感言1000字
2014/02/25 职场文书
高中军训感言1000字
2014/03/01 职场文书
班级学雷锋活动总结
2014/06/26 职场文书
2014年部门工作总结
2014/11/12 职场文书
安全责任协议书范本
2016/03/23 职场文书
实用求职信模板范文
2019/05/13 职场文书
班组长如何制订适合本班组的工作计划?
2019/07/10 职场文书
2019新员工试用期转正申请书3篇
2019/08/13 职场文书
php 防护xss,PHP的防御XSS注入的终极解决方案
2021/04/01 PHP
MySQL5.7并行复制原理及实现
2021/06/03 MySQL