zoukankan      html  css  js  c++  java
  • javascript基础-js继承

    1.prototype方式

    示例:没有使用prototype(下列这些代码只能获取array1数组的总和,而无法对array2数据进行求和)

    var array1 = new Array(1,4,9,13);
    var array2 = new Array(15, 20, 35);
    
    array1.sum1 = function( ) {
        var result = 0;
        for(var i=0; i<array1.length; i++) {
            result = result + array1[i];
        }
        return result;
    };

    示例:使用 prototype后

    Array.prototype.sum = function( ) {
        var result = 0;
        for(var i=0; i<array1.length; i++) {
            result=result + array1[i];
        }
        return result;
    }
    //使用prototype代表对所有数组的求和计算
    console.log(array1.sum1( ));     //27
    console.log(array2.sum( ));        //27

     总结:使用 prototype 可以对某一类对象方法进行扩展

    那么如何使用prototype继承?

    示例:

    // 父类
    function
    Parent( ) {     var name;     var age;     this.setName = function(thisName) {         name = thisName;     }     this.getName = function( ) {         return name;        }     this.setAge = function(thisAge) {         age = thisAge;        }     this.getAge = function() {         return age;        } }
    // 子类
    function Child( ) {

    }
    // 子类继承父类,将直接继承父类的所有public属性和方法 Child.prototype 
    = new Parent(); var c = new Child(); c.setName("张三"); c.setAge(25); console.log(c.getName( )+" "+c.getAge( ));

    2.apply方式

    语法:

    Function.apply(obj, args)  方法能接收两个参数

    obj:这个对象将代替Function类里this对象

    args:这个是数组,它将作为参数传给Function(args-->arguments)

    apply方法的使用:

    function Parent(name) {
        this.name = name;
        var age = 25;
        this.getAge = function( ) {
            return age;
        }
    }
    function Child(name) {
        this.say = function() {
            return this.name+" "+this.getAge();
        }
        this.getName = function(){
            return name;
        }
    }
    var c = new Child("张三");
    Parent.apply(c,[c.getName()]); console.log(c.say());    
    //张三 25 var c=new Child("张三"); Parent.apply(c,[""]); console.log(c.say());     // 25

    如何使用apply继承?

    示例一(不推荐):

    function Parent(name) {
        var name = name;
        this.getName = function( ) {
            return name;
        }
    }
    function Child() {
    
    }
    
    var c = new Child();
    Parent.apply(c,["张三"]);
    console.log(c.getName());     // 25

    示例二:

    /*定义一个人类*/  
    function Person(name, age) {  
        this.name=name;  
        this.age=age;  
    }  
    /*定义一个学生类*/  
    function Student(name, age, grade) {  
        Person.apply(this, arguments);  
        this.grade = grade;  
    }  
    //创建一个学生类  
    var student=new Student("zhangsan",21,"一年级");  
    //测试  
    console.log("name:"+student.name+"
    "+"age:"+student.age+"
    "+"grade:"+student.grade);  

    分析:
    Person.apply(this,arguments);
    this:在创建对象在这个时候代表的是student
    arguments:是一个数组,也就是[“zhangsan”,”21”,”一年级”];  通俗一点讲就是父类Person构造中的参数

    3.call方式

    与apply 方法非常类似,只不过是apply 中 args 中一个数据,而call 中是一个一个的参数

    语法:

    Function.apply(obj, arg1, arg2, ...)   可以接收(0-N)个参数

    call 方法的使用

    function Show() {
        console.log(this);   
    }
    // 1.直接调用:Show( );    这种调用方法其实是js 中的一种缩写
    // 2.Show.call( );        这种才是js调用
    Show.call( );           // window
    Show.call(12);          // 将打印12,即show方法中的this值变为12
    
    function Show2(name, age) {
        console.log(this, name, age);   
    }
    Show2("波哥", 25);                         // window, "波哥", 25
    Show2.call("abc", "caoxiaobo", 25);       // {"abc"}, "caoxiaobo", 25

     如何使用call方法继承?

    function A( ) {
        this.abc = 24;   
    }
    A.prototype.get = function( ) {
        console.log("abc的值为:" + this.abc);
    }
    function B( ) {
        A.call(this);            // 继承A的所有属性
    }
    B.prototype.save = function( ) {
        console.log("B方法中的save");   
    }
    
    B.prototype = A.prototype;    // 继承A的所有方法(注间,不能写在创建B对象的下面)
    var b = new B();
    var a = new A();
    console.log(b.abc);
    b.get( );
    a.save( );
    function Parent(name, age) {
        var name = name;
        var age = age;
        this.getName = function( ) {
            return name;
        }
        this.getAge = function( ) {
            return age;
        }
    }
    function Child() {
    
    }
    
    var c = new Child();
    Parent.call(c,"张三", 20);
    console.log(c.getName(), c.getAge());     // 张三 20

    同样也可以这样写:

    function Parent(name, age) {
        var name = name;
        var age = age;
        this.getName = function( ) {
            return name;
        }
        this.getAge = function( ) {
            return age;
        }
    }
    function Child(name, age) {
        Parent.call(c, name, age);
    }
    
    var c = new Child("张三", 20);
    console.log(c.getName(), c.getAge());     // 张三 20

    4.对象冒充

    实现原理:让父类的构造函数成为子类的方法,然后调用该子类的方法,通过this关键字给所有的属性和方法赋值

    function Parent(name) {
        this.name = name;
        var age = 40;
        this.getAge = function( ) {
            return age;
        }
    }
    function Child(name) {
        this.method = Parent;     // this.method是作为一个临时的属性,并且指向Parent所指向的对象,
        this.method(name);        // 执行this.method方法,即执行Parent所指向的对象函数
        delete this.method;       // 销毁this.method属性,即此时Child就已经拥有了Parent的所有属性和方法
        this.say = function( ) {
            return this.name+" "+this.getAge();
        }
    }
    var c = new Child("李四");
    console.log(c.say());

    5.混合模式

     propotype + call / apply 方式

    function Parent( ) {
        this.getAge = function( ) {
            return this.age;
        }
    }
    
    Parent.prototype.sayParent = function( ) {
       alert("this is parentmethod!!!");
    }
    
    function Child(name) {
        Parent.call(this);
        this.name = name;
        this.age = 40;
        this.say = function( ) {
            return this.name+" "+this.getAge( );
        }
    }
    
    Child.prototype = new Parent();
    var c = new Child("张三");
    console.log(c.say( ));
    c.sayParent( );
  • 相关阅读:
    浅谈移动端设备标识码:DeviceID、IMEI、IDFA、UDID和UUID
    Linux下的crontab定时执行任务命令详解
    SHOW INDEX查询MySQL表索引
    Vue非父子组件传值方式。
    windows 双网卡 内外网上网配置说明
    战神引擎部署备注说明
    k8s service直接暴露外部访问配置
    Kubernetes 五种资源控制器详细介绍以及功能演示(转)
    docker网络
    在Linux服务器,一键搭建K8s服务【脚本篇】(转)
  • 原文地址:https://www.cnblogs.com/caoxb/p/9534428.html
Copyright © 2011-2022 走看看