• 浅谈javascript关键字"call"


    javascript中的关键字call对与一些js新手来说有点难理解,一些权威的资料上解释的是,call的作用可以用来代替另一个对象调用一个方法,话说到此,javascript还有一个关键字apply能够和call一样实现相同的功能,只不过用obj1.function.apply(obj2,argments)时,argments需要是一个数组,而call只需要一个类数组,这里就不讨论类数组和数组的区别了。回来再聊call,话说如果你是一个面向对象开发者的话,你马上会怀疑这句话的真实性,但是在若类型语言javascript中则是完全可以的,但是如何理解“代替另一个对象调用一个方法呢?”,下面就允我一一到来。

    首先需要理解javascript中的一些基本特点,它是没有明确类的概念,而是基于对象的本质特征,即函数也是对象。看下面一段代码:

    function add(a,b){
     return a+b;
    }
    function sub(a,b){
     return a-b;
    }
    add.call(sub,5,4);
    输出//9

    套用刚开的话就是sub代替window调用了全局的add方法,后面的两个参数是传给add方法的两个参数。理解了吗?你是不是在怀疑sub呢?它只是一个函数啊,那我纠正你,函数也是一个对象啊,至此sub代替window调用add方法,并传进两个参数。
    你是不是还在怀疑呢?那好,再举个例子,这回不用函数了,直接用对象实例,看下面代码:

    function ClassA(name){
     this.name=name;
     this.showName=function(){
     alert(this.name);
    }
    };
    function classB(name){
     this.name=name;
    };
    var obj1=new classA("hao");
    var obj2=new classB("liang");
    obj1.showName.call(obj2)
    //输出 liang

    本来showName()是obj1对象的方法,现在通过call交给obj2来调用,是不是典型的借鸡下蛋呢?
    javascript中的关键字call的另外一个用途就是来实现继承。看下面的代码:

    function superT(){
       this.add=function(a,b){
       alert(a+b) 
      };
        this.sub=function(a,b){
        alert(a-b) 
       }
    }
    
    function Test(){
    superT.call(this);
    }
    var obj=new Test();
    obj.add(5,4);// 输出 9
    obj.sub(5,4);// 输出 1;

    是不是很有意思呢,Test完全继承了superT,通过Test构造出来的对象自然能够调用自己的方法了;

    总结一下,javascript中的关键字call,一是用来借鸡下蛋,另外一个用途就是用来继承(fn.call(this)),基本原理就是取代另一个对象调用此方法;

  • 相关阅读:
    代码编辑
    作业7
    实验 13 综合练习三
    模版 实验二 概要设计
    在线评测系统(OJ)使用方法
    作业 6 结构体
    结构体简介
    实验 10 指针2
    (第一周)软件工程四人组
    (第一周)读《构建之法》
  • 原文地址:https://www.cnblogs.com/haohaoday/p/2735828.html
Copyright © 2020-2023  润新知