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 相关文章推荐
jQuery.Validate验证库的使用介绍
Apr 26 Javascript
验证码在IE中不刷新而谷歌等浏览器正常的解决方案
Mar 18 Javascript
$.each遍历对象、数组的属性值并进行处理
Jul 18 Javascript
jQuery页面加载初始化的3种方法(推荐)
Jun 02 Javascript
jQuery实现的瀑布流加载效果示例
Sep 13 Javascript
微信小程序 picker 组件详解及简单实例
Jan 10 Javascript
Webpack打包慢问题的完美解决方法
Mar 16 Javascript
微信小程序实战之自定义抽屉菜单(7)
Apr 18 Javascript
jquery仿微信聊天界面
May 06 jQuery
javascript实现考勤日历功能
Nov 29 Javascript
JavaScript简单实现的仿微博留言功能示例
Jan 17 Javascript
javascript实现blob加密视频源地址的方法
Aug 08 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下将XML转换为数组
2010/01/01 PHP
linux下为php添加curl扩展的方法
2011/07/29 PHP
深入PHP中的HashTable结构详解
2013/06/13 PHP
php批量添加数据与批量更新数据的实现方法
2014/12/16 PHP
让innerHTML的脚本也可以运行起来
2006/07/01 Javascript
游览器中javascript的执行过程(图文)
2012/05/20 Javascript
javaScript array(数组)使用字符串作为数组下标的方法
2013/11/19 Javascript
js 判断js函数、变量是否存在的简单示例代码
2014/03/04 Javascript
JavaScript实现级联菜单的方法
2015/06/29 Javascript
JavaScript实现动态删除列表框值的方法
2015/08/12 Javascript
浅谈jquery中next与siblings的区别
2016/10/27 Javascript
BootStrap中关于Select下拉框选择触发事件及扩展
2016/11/22 Javascript
原生JS实现逼真的图片3D旋转效果详解
2019/02/16 Javascript
node.js express框架实现文件上传与下载功能实例详解
2019/10/15 Javascript
微信小程序录音实现功能并上传(使用node解析接收)
2020/02/26 Javascript
JS函数本身的作用域实例分析
2020/03/16 Javascript
JavaScript实现点击出现子菜单效果
2021/02/08 Javascript
python解析模块(ConfigParser)使用方法
2013/12/10 Python
python模拟enum枚举类型的方法小结
2015/04/30 Python
python通过定义一个类实例作为ftp回调方法
2015/05/04 Python
一键搞定python连接mysql驱动有关问题(windows版本)
2016/04/23 Python
python用装饰器自动注册Tornado路由详解
2017/02/14 Python
Python 40行代码实现人脸识别功能
2017/04/02 Python
Python tkinter模块中类继承的三种方式分析
2017/08/08 Python
python config文件的读写操作示例
2019/09/27 Python
西班牙在线药店:DosFarma
2020/03/28 全球购物
J2EE面试题集锦(附答案)
2013/08/16 面试题
什么是ESB?请介绍一下ESB?
2015/05/27 面试题
安全协议书范本
2014/04/21 职场文书
珍爱生命演讲稿
2014/05/10 职场文书
优秀班主任材料
2014/12/16 职场文书
中学生打架检讨书之500字
2019/08/06 职场文书
2020年元旦祝福语录,总有适合你的
2019/12/31 职场文书
MySql学习笔记之事务隔离级别详解
2021/05/12 MySQL
python百行代码实现汉服圈图片爬取
2021/11/23 Python
python在package下继续嵌套一个package
2022/04/14 Python