zoukankan      html  css  js  c++  java
  • Javascript玩转继承(三)

    在前两篇文章中,介绍了构造继承和原型继承。今天把剩下的两种写完,这两种的应用相对于前两种来说应用很少,因此称为是非主流继承方式。

    首先,来看非主流继承一:实例继承法。
    我也不说那么多废话了,既然是非主流继承,就一定不常用,既然不常用还存在,那就只有一个因素,他用于特定的场合。实例继承法,就主要用于核心对象的继承,也是目前为止唯一能够解决核心对象继承的方式。
    核心对象的继承拥有一定的价值,比如说Error对象,我们公司可能要自己实现一个Error 类来简化今后的开发,那么这个时候我就要使用实例继承法来继承Error。
    代码如下:

    function ExtendingError(mes)
    {
    var instance=new Error(mes);
    instance.NewError=function(){
    alert("Your Error is "+mes); 
    } www.jbxue.com
    return instance;
    }

    好,测试下:

    var e=new ExtendingError("Your number is less than one");
    e.NewError();
    alert(e.toString());

    这个是非主流继承方式,基本只用于核心对象的继承,记住就好!

    接下来看看非主流继承二:拷贝继承法.
    顾名思义,拷贝继承,就是通过拷贝实现对象的继承,拷贝什么呢?很明显,就是对象的属性和方法,还记得Javascript中,类其实就一个Hashtable么?如果想不起来的话,就回去复习一下基础,我可能会在过一段时间写一篇关于Javascript对象的知识。
    了解了这个就好办了,直接看代码:
    首先写一个Extend方法:

    Function.prototype.Extend=function(){
    for(var pro in obj)
    {
    //这样其实就是把父类的属性和方法完全复制过去了
    this.prototype[pro]=obj[pro];
    }
    }

    好了,再写段代码看下如何使用:

    function Animal()
    { }
    function People()
    { }
    People.Extend(new Animal())
    { }

    明眼人一眼看出来,这个方法的缺点太明显了:

    将对象的属性方法一一复制的时候,其实用的是反射,反射对效率的损伤我就不多说了。
    和原型继承一样,必须初始化父类对象,当确定继承关系时,但是参数还不确定时,玩不转!
    总之,这个方法一般情况下不用。
    好了,下面说个常用的东西。混合继承!
    这个是基于两个主流继承方式的。对比两个继承方式,我们可以发现两个继承方式的优缺点是互补的,那就好办了,混合到一起吧!

    function People(name)
    {
    this.name=name;
    this.SayName=function(){
    alert("My name is "+name);
    } www.jbxue.com
    }
    function Girl(name,age)
    {
    //构造继承
    this.father=People;
    this.father(name);
    delete this.father;
    this.Introduce=function(){
    alert("My name is "+name+".I am"+age);
    }
    }
    //原型继承
    Girl.prototype=new People();

    好了,两种方式的混合,现在看看,是不是问题解决了呢?

    var g=new Girl("Xuan",22);
    alert(g instanceof People);
    g.SayName();
    g.Introduce();

    测试通过!

    这是一个相对完美的解决方案,但是却增加了代码的复杂度,所以具体的方案还要靠大家在实践中去选择。

  • 相关阅读:
    BGP的MA网络、自动汇总、聚合
    [转载]CISCO配置HSRP
    BGP选路十种方法总结 用实验详细介绍(副实验拓扑)
    [win技巧] windows 7的上帝模式你用过吗?【相信你没用过!如此方便的的设置】
    CISCO BGP(EBGP/IBGP)基本配置小结以及如何防止BGP路由黑洞(附实验拓扑)
    执行外部程序
    C#编写COM组件
    在SQL Server 2005上遇到了先删除已运行维护计划后,再删除代理中由其产生的作业时,提示删除失败,如何处理?
    关于存储过程编写的一点总结(转)
    WCF:调用方未由服务器进行身份验证
  • 原文地址:https://www.cnblogs.com/cfinder010/p/3718040.html
Copyright © 2011-2022 走看看