• 浅谈javascript继承【读javascript设计模式第四章节继承有感】


    javascript继承,无任是类式继承,原型式继承还是渗元式继承都是通过不同方法去围绕着prototype转,简单分析下三种不同继承方法是如何围绕prototype转的

    一:类似继承,先上关键代码

    function extend(subClass,supClass){
      var fn = function(){};
      fn.prototype = supClass.prototype;
      subClass.prototype = new fn();
      subClass.prototype.constructor = subClass;
      subClass.supClass = supClass;           
      if(supClass.prototype.constructor == Object){
        supClass.prototype.constructor = supClass;
      } 

    }

    首先通过代码可以看出这个是类与类的继承,通过把子类的prototype设置成new一个空的构造函数,改空的构造函数的prototype是父级类的prototype,好处是类与类之间的结构比较明确,

    使用参考代码:

    function FormField(){
      this.init.apply(this,arguments)
    }
    FormField.prototype = {
      init:function(){
        console.log("init");
        this.bind();
      },
      bind:function(){
        console.log("bind");
      }
    };

    function FormArea(){
      this.constructor.supClass.call(this);

    };

    extend(FormArea,FormField);
    var formArea = new FormArea();

    二:原型式继承,先上关键代码

    function clone(obj){
      var fn = function(){};
      fn.prototype = obj;
      return new fn();

    }

    该方式优点是节约内存,无需上面那些类的各种指向,当前方式的有点恰巧也是他的缺点,改方式会共享他们的指针,特别是当指向的是一个对象或者数组的时候,得小心,clone出来的同事要重新复制替换掉之前的指向,另外同类式继承最大的区别,是类式继承是通过prototype = new XXX(某个父类),而原型是直接把prototype设置成一个字面量对象,

    使用参考代码:

    var formField = {

      init:function(){

      }

    }

    var formArea = clone(formField);

    formArea.init();

    三:渗元式,先上关键代码

    function augment(receveClass,giveClass){
      if(arguments.length == 2){
        for(var i in giveClass.prototype){
          if(!receveClass.prototype[i]){
            receveClass.prototype[i] = giveClass.prototype[i]
            }
        }
      }else{
        var args = [].slice.call(arguments,2);
        for(var j=0, len=args.length; j<len; j++){
        if(!receveClass.prototype[args[j]]){
          receveClass.prototype[args[j]] = giveClass.prototype[args[j]];
          }
        }
      }
    }

    由于javascript是不能实现继承多个父类的,因为它就一个prototype,所以可以通过上面的方法去扩展prototype的方式去模拟继承多个父类的效果,

    使用参考代码:

    function Minx(){}
      Minx.prototype = {
      sayName:function(){
        p("sayName")
      },
      sayAge:function(){
        p(29);
      }
    }       
    function Person(){};
    augment(Person,Minx,"sayName");
    var p1 = new Person();
    p1.sayName();

    总结:

    适应场合:方式一适合构造过程中需要传值去区分不同对象的情况,方式二适合带有很多默认属性,而大部分默认属性又都相同场合,且比较节约内存,方式三适合多个差异度很大的累,但是这些类里的某个方式又一样的场合下

  • 相关阅读:
    Vsftp的PASV mode(被动模式传送)和Port模式及 Linux下VsFTP配置全方案
    vsftpd:500 OOPS: vsftpd: refusing to run with writable root inside chroot ()错误的解决方法
    CentOS7.2部署FTP
    Apache与Nginx的优缺点比较
    MySQL存储引擎--MyISAM与InnoDB区别
    CentOS 7下搭建配置SVN服务器
    Remi 安装源
    tmpx75 I2C 温度传感器驱动程序添加
    QT 5.7.0 交叉编译记录
    am335x SGX 移植
  • 原文地址:https://www.cnblogs.com/samKR/p/3785199.html
Copyright © 2020-2023  润新知