zoukankan      html  css  js  c++  java
  • js call() apply()

    ECMAScript规范给所有函数都定义了Call()与apply()两个方法,call与apply的第一个参数都是需要调用的函数对象,在函数体内这个参数就是this的值,剩余的参数是需要传递给函数的值,call与apply的不同就是call传的值可以是任意的,而apply传的剩余值必须为数组。

    例如:

    function add(a, b) { return a + b; }
    
    function sub(a, b) { return a - b; }
    
    /*apply用法
    
    * var a1 = sub.apply(add, [4, 2]);
    
    *var a2= add.apply(sub, [4, 2]);  
    
    */
    
    var a1 = sub.call(add, 4, 2);
    
    var a2= add.call(sub, 4, 2);
    
    输出:a1=2  a2=6

    感觉还是有意未尽,更有意思的还在下面

    js总是认为他是万能的,既然高级语言会继承,我js也不能示弱:JS模仿继承

    function fun1() {
        this.a = 123;
        this.add = function () { return  this.a }
    }
    
    function fun2() {
        this.a = 456;
    }
    
    var f1=new fun1()
    var f2=new fun2()
    var a = f1.add.call(f2);  // a输出的是456

    这里就是把啊f1的方法拿给f2来使用,f2便可以使用f1中所有的方法,这不正是高级语言中继承的概念喽。当然根据综上可扩展出多继承,使用多个call便可以实现多继承

    function fun1() {
        this.add = function () { return this.a + this.b }
    }
    
    function fun2() {
        this.sub = function () { return this.a - this.b }
    }
    
    function fun3() {
        this.a = 10;
        this.b = 2;
        
        fun1.call(this);
        fun2.call(this);
    
    }
    
    var f3 = new fun3()
    
    alert(f3.add());
    
    alert(f3.sub());

     

  • 相关阅读:
    程序的本质复杂性和元语言抽象
    编译器词法消歧设计
    关于分工的思考 (Thoughts on Division of Labor)
    数据即代码
    类型的本质和函数式实现
    二叉树迭代器算法
    kvm虚拟化存储管理
    kvm网络虚拟化管理
    kvm虚拟机的四种网络模式
    Linux 中交换空间 (swap)应该分多大才好?
  • 原文地址:https://www.cnblogs.com/mrxia/p/4191084.html
Copyright © 2011-2022 走看看