zoukankan      html  css  js  c++  java
  • javascript中的call方法

    该方法应用于function对象(即function本身或者通过new关键字创建的function实例)

    该方法的第一个用途是调用一个对象的一个方法(非常的干巴巴是不是?官方解释往往都不说人话,看下面的例子即可):

    function add(a,b){
            document.write(a + b);
    }
    function sub(a,b){
            document.write(a - b);
    }
    add.call(sub,3,1);
    

    页面输出结果为:4
    所以到这儿可有这样的总结:call方法可以由函数A来调用,调用之后传入若干参数,第一个参数为函数B,第二、三个参数为函数要执行时的参数,call方法执行的结果是函数A替换掉函数B的函数体内容,所以上面的例子执行了相加的运算而不是相减的
    这个功能用来干什么?感觉好废的样子有没有?莫慌,有意思的在下面

    function Class1(){
            this.name = "Sam";
            this.showName = function(){
                    alert(this.name);        
            }
    }
    function Class2(){
            this.name = "Jack";        
    }
    

    然后创建一个Class1的实例

    var c1 = new Class1();
    c1.showName();
    

    页面输出"Sam",没有任何问题
    然后再创建一个Class2的实例

    var c2 = new Class2();
    c1.showName.call(c2);
    

    页面输出"Jack"
    这个结果貌似有点惊悚,Class2的实例居然可以通过一个call方法调用Class1的私有方法,不过惊悚过后有没有觉得这个功能和某个javascript里面没有但在其它编程语言中很重要的一个功能很像?
    接着往下看

    function Class1(){
            this.sayHi = function(txt){
                    alert(txt);
            }        
    }
    function Class2(){
            Class1.call(this);        
    }
    

    然后创建一个Class1的实例

    var c1 = new Class1();
    c1.sayHi("hello,Jack");
    

    页面输出"hello,Jack",没有任何问题
    然后再创建一个Class2的实例

    var c2 = new Class2();
    c2.sayHi("hello,Sam");
    

    页面输出"hello,Sam"
    代码写到这里,"继承"这个词已经浮出水面,在Class2中加了一句Class1.call(this)就使Class2继承了Class1的属性和方法,javascript就是靠call方法来模拟继承的概念
    Class1.call(this);这句代码中的this即是指当前对象就是Class1本身,Class1.call即是用Class1的对象代替当前的Class2对象(网上有的文章叫“对象冒充”),所以Class2的实例拥有了Class1的属性和方法
    需要说明的是,我觉得用“替换”这个词不准确,如果Class2同时还拥有自已的属性和方法,那这些属性和方法肯定也是一直存在的,如果用“替换”会让人想到把Class2本身的属性和方法干掉,但暂时想不到更合适的描述,姑且先这样记着
    这是最基本的继承,javascript里的继承可不可以更酷一点?看下面代码

    function Class1(){
            this.sayHi = function(){
                    alert("hello,world");        
            }        
    }
    function Class2(){
            Class1.call(this);        
    }
    function Class3(){
            Class2.call(this);        
    }
    

    然后创建一个Class3的实例

    var c3 = new Class3();
    c3.sayHi();
    

    页面居然输出了"hello,world"!
    这样,通过call方法,javascript还实现了江湖上失传已久的多重继承。

    ------------------------------- 把努力当成习惯 -------------------------------
  • 相关阅读:
    Python基础-EMS系统
    python基础-数据结构及数据读取操作
    python基础-猜数游戏
    python基础-质数判断及优化
    利用5次shift漏洞破解win7密码
    python基础-水仙花数判断
    pickle,json ;random,shelve
    block母版继承,include模板导入,inclusion_tag自定义模板
    多道技术,阻塞非阻塞,同步异步,udp,tcp,孤儿僵尸进程
    深度广度继承,抽象类接口,绑定方法,@propertry,继承封装接口多态鸭子类型关系,组合
  • 原文地址:https://www.cnblogs.com/qinchuan/p/4309159.html
Copyright © 2011-2022 走看看