• 面向对象的Javascript(5):继承


            在小项目中对于JavaScript使用,只要写几个function就行了。但在大型项目中,尤其是在开发追求 良好的用户体验的网站中,如SNS,就会 用到大量的JavaScrpt,有时JavaScript的工作量胜过了C#,这时写一堆function,就会显得很乱,杂乱无章,甚至会出现命名冲突,管理和维 护起来都很麻烦。对于这种情况我们就需要使用面向对象的思想来开发JavaScript。那我们就这样作罢:

      所有面向对象的语言都应该有继承的特性,JavaScript 也不例外。
      在JavaScript中实现继承可以有多种方法,下面说两种常见的。

      一,call 继承,先看代码:
      先定义一个“人”类
    //人类
    Person
    =function(){
        
    this.name="草泥马";
        
    this.eat=function(){
            alert(
    "我要吃饭");
        }
        
        
    this.sleep=function(){
           alert(
    "我要睡觉");  
        }

    }

      再定义一个学生类,让它继承于Person

    //学生类
    Student
    =function(){
        Person.call(
    this);//继承Person类
        this.doHomework=function(){
            alert(
    "老师来了,作业借我抄下");
        }
       
    }

      关键看 Person.call(this)这句,其中this代表当前对象,即Student ,这很容易理解,而Person.call(this)的意思是:将Person类的所有的公开成员“附加”给Student类,让Student也具有了Person的所有功能。
      和高级语言一样,如果子类中出现了和父类中同名的成员,则会将其覆盖,也就是所谓的“重写”了。

      同样的,我们再定义一个女孩类 :

    //女孩类
    Girl
    =function(){
        Person.call(
    this);//继承Person类
        this.sex="";
    }

       JavaScript是可以实现多重继承的,请看下面的Master(硕士)类,这个Master 自然是个学生,但同时又是个漂亮MM,于是有了下面的代码:

    //硕士类
    Master=function(){
        Student.call(
    this);//继承Student类
        Girl.call(this);//继承Girl类
        this.degree="硕士";//学历
        
    }

       我们可以测试一下:

    var master=new Master();
    master.name
    ="凤姐";
    master.eat();
    master.doHomework();
    alert(
    "偶是名字叫:"+master.name);
    alert(
    "偶的性别是:"+master.sex);
      多重继承时要注意顺序,如果两个类中有相同名称的成员,那么后一个将覆盖前一个,也就是说当前类只会继承后一个类中的成员。
      call 方法继承就说到这,如果大家对call方法不清楚,就请去问问谷歌兄,我就不赘述了,网上转载得不要太多。下面说下另外一种继承方式。

      二,prototype 原型继承:

      我们再定义一个班长类:

    //班长类
    SquadLeader=function (){
        
    //打招呼
        this.hi=function(){
            alert(
    "同学们好,我现在是班长了");
        }
    }

      上面定义了一个硕士类,现在这个硕士被提升为班长了,所以这个Master要继承SquadLeader了,这次我们用prototype 来实现,请看下面代码:

    Master.prototype=new SquadLeader();//prototype 属性指向一个对象 
    //
    或者
    //
    Master.prototype=SquadLeader.prototype;

      这样Master就继承了SquadLeader类,就这么一句话,这里有两种形式,其实原理是一样的。意思是:将SquadLeader的“灵魂”拷贝给了Master,于是从此SquadLeader能做的事,Master都可以做了。
         测试一下:

      var master=new Master();
      master.hi()//输出“同学们好,我现在是班长了”  
      

      我个人比较喜欢用第一种方案(call 继承)来实现继承,所有代码都包在一个“{}”内,一目了然,在书写风格上较之于第二种更接近于C#。prototype 属性我一般用来对已有的类做扩展。

      JavaScript是门非常灵活的语言,实现继承可能还有其他更好的方式,大家可以去研究挖掘,我在这就当是抛了块砖头, 希望能引出华美的玉石!

     原文地址:http://www.cnblogs.com/xumingxiang/archive/2010/05/01/1725680.html

    作者 : 徐明祥
    出处:http://www.cnblogs.com/xumingxiang 
    版权:本文版权归作者和博客园共有
    转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢
    要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
  • 相关阅读:
    JVM调优
    Java堆空间的划分:新生代、老年代
    说一下 jvm 有哪些垃圾回收器?
    JVM的垃圾回收算法有哪些
    订单并发处理--悲观锁和乐观锁、任务队列以及订单模块开发流程
    MySQL数据库的四种事务隔离级别以及事务的并发问题(脏读/不可重复读/幻读)
    Python面试总结复习(四)
    Python面试总结复习(三)
    Django表设计,多表操作复习
    python面试总结复习(二)
  • 原文地址:https://www.cnblogs.com/xumingxiang/p/1725680.html
Copyright © 2020-2023  润新知