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 相关文章推荐
用户注册常用javascript代码
Aug 29 Javascript
js 模拟实现类似c#下的hashtable的简单功能代码
Jan 24 Javascript
基于jquery的跟随屏幕滚动代码
Jul 24 Javascript
JS实现可展开折叠层的鼠标拖曳效果
Oct 09 Javascript
JavaScript中Array的实用操作技巧分享
Sep 11 Javascript
vue从使用到源码实现教程详解
Sep 19 Javascript
jQuery 实现ajax传入参数含有特殊字符的方法总结
Oct 17 Javascript
原生js实现网页顶部自动下拉/收缩广告效果
Jan 20 Javascript
DOM事件探秘篇
Feb 15 Javascript
js实现简易垂直滚动条
Feb 22 Javascript
jQuery实现遍历复选框的方法示例
Mar 06 Javascript
旺旺在线客服代码 旺旺客服代码生成器
Jan 09 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
php eval函数一句话木马代码
2015/05/21 PHP
PHP如何通过表单直接提交大文件详解
2019/01/08 PHP
JavaScript与DropDownList 区别分析
2010/01/01 Javascript
JS实现三个层重叠点击互相切换的方法
2015/10/06 Javascript
深入浅析JavaScript字符串操作方法 slice、substr、substring及其IE兼容性
2015/12/16 Javascript
莱鸟介绍window.print()方法
2016/01/06 Javascript
浅谈angularjs $http提交数据探索
2017/01/20 Javascript
Node.js安装配置图文教程
2017/05/10 Javascript
详解微信小程序 template添加绑定事件
2017/06/23 Javascript
JS中LocalStorage与SessionStorage五种循序渐进的使用方法
2017/07/12 Javascript
JavaScript中EventLoop介绍
2018/01/22 Javascript
改变vue请求过来的数据中的某一项值的方法(详解)
2018/03/08 Javascript
12个提高JavaScript技能的概念(小结)
2019/05/09 Javascript
在layui中layer弹出层点击事件无效的解决方法
2019/09/05 Javascript
转换layUI的数据表格中的日期格式方法
2019/09/19 Javascript
Vue组件通信入门之Provide和Inject机制
2019/12/29 Javascript
antd日期选择器禁止选择当天之前的时间操作
2020/10/29 Javascript
详解Vue中的自定义指令
2020/12/07 Vue.js
Python字符串处理函数简明总结
2015/04/13 Python
安装dbus-python的简要教程
2015/05/05 Python
python的paramiko模块实现远程控制和传输示例
2017/10/13 Python
python入门前的第一课 python怎样入门
2018/03/06 Python
Win7 64位下python3.6.5安装配置图文教程
2020/10/27 Python
对python csv模块配置分隔符和引用符详解
2018/12/12 Python
解决Django连接db遇到的问题
2019/08/29 Python
Django1.11自带分页器paginator的使用方法
2019/10/31 Python
Python函数参数分类原理详解
2020/05/28 Python
大学生旷课检讨书
2014/01/22 职场文书
给小学生的新年寄语
2014/04/04 职场文书
献爱心标语
2014/06/21 职场文书
大学专科求职信
2014/07/02 职场文书
物业前台接待岗位职责
2015/04/03 职场文书
安全承诺书格式范本
2015/04/28 职场文书
休学证明范本
2015/06/19 职场文书
tensorflow学习笔记之tfrecord文件的生成与读取
2021/03/31 Python
详解RedisTemplate下Redis分布式锁引发的系列问题
2021/04/27 Redis