• 继承的三种方式


    【JS OOP中的继承】
    1、继承:使用一个子类继承另一个父类,那么子类可以自动拥有父类中的所有属性和方法,这个过程叫做继承
    >>>继承的两方,发生在两个类之间
    2、扩展Object实现继承
    ①、声明父类

    function Person(){
             
    }

    声明子类

    function Son(){
    
    }

    ②、通过prototype给Object类添加一个扩展方法;

    Object.prototype.extend = function(parent){
          for(var i in parent){
               this[i] = parent[i];
          }
    }

    ③、分别拿到父类对象和子类对象

    var p = new Person();
    var s = new Student();

    ④、用子类对象,调用扩展方法,实现继承操作

    s.extend(p);

    3、实现继承的原理
    通过循环,将父类对象的所有属性和方法,全部赋给子类对象,关键点在于for-in循环,即使不扩散Object,也能通过简单的循环实现操作
    4、扩展Object继承的缺点
    ①、无法通过一次实例化,直接拿到完整的子类对象,而需要先拿到父类对象和子类对象两个对象,在手动合并。
    ②、扩展Object的继承方法,也会保留在子类的对象上。

    【JS OOP中的继承】
    1、继承:使用一个子类继承另一个父类,那么子类可以自动拥有父类中的所有属性和方法,这个过程叫做继承
    >>>继承的两方,发生在两个类之间

    2、使用原型实现继承
    ①、定义父类

    function Parent(){
    
    }

    定义子类

    function Son(){
    
    }

    ②、将父类对象,赋值给子类的prototype

    Son.prototype = new Person();

    ③、拿到子类对象时,就会将父类对象的所有的属性和方法,添加到__proto__

    var s = new Son();
    

    3、使用原型继承的原理
    将父类对象,赋值给子类的prototype,那么父类对象的属性和方法就会出现在子类的prototype中。那么,实例化子类时,
    子类的prototype又会到子类对象的__proto__中,最终,父类对象的属性和方法,会出现在子类对象的__proto__中

    4、这种继承的特点
    ①、子类自身的所有属性都是成员属性,父类继承过来的属性都是原型属性
    ②、依然无法通过一步实例化拿到完成的子类对象

    【call/bind/apply】
    1、三个函数的作用:通过函数名调用这三个函数,可以强行将函数中的this指定为某个对象
    2、三个函数的写法(区别):
    call写法:func.call(func的this指向的obj,func参数1,func参数2,……);
    apply写法:func.apply(func的this指向的obj,[func参数1,func参数2,……]);
    bind写法:func.bind(func的this指向的obj)(func参数1,func参数2,……);
    3、三个函数的唯一区别:在于接受func的参数列表的方式不同,除此之外,没有任何不同。

    【使用call/bind/apply实现继承】
    1、实现步骤
    ①、定义父类

    function Person(name){
    
    }
    

    ②、定义子类时,在子类中使用三个函数,调用父类,将父类函数的this,指向为子类函数的this

    function Student (no) {
           this.no = no;
           Person.call(this,name,age);
    }
    

    ③、实例化子类时,将自动继承父类属性

    var s = new Son(12,"张三");
    

      

  • 相关阅读:
    webservice 测试窗体只能用于来自本地计算机的请求
    Derby 数据库 客户端 ij使用
    Liunx 命令大全
    Linux 日志命令
    Git with SVN
    Git 重写历史 filter-branch
    Git you are not allowed to push code to protected branches on this project?
    sqlldr 用法
    hibernate_sequence.nextval 序列不存在
    redis持久化方案
  • 原文地址:https://www.cnblogs.com/liuqiang1109/p/7674848.html
Copyright © 2020-2023  润新知