zoukankan      html  css  js  c++  java
  • this bind apply call

    this 是当前函数运行时所属的对象
    bind 是指定一个函数运行时的上下文,也就是说把这个函数的this指向绑定到相应对象上,默认的暴露在全局御中的函数this指向widow对象, 严格模式下全局的this为undefined
    call和apply的作用是一样的 ,大致是执行某个函数但是用另一个对象的实例替换为上下文执行,call传参数的方法是通过" ,"号的方式分隔着传进去,
    apply是直接传一个参数数组进去


    call方法:
    语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]])
    定义:调用一个对象的一个方法,以另一个对象替换当前对象。
    说明:
    call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
    如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

    
    
    // 示例1:
    var tmp = {
         dd:20, add:
    function (a,b){ console.log('tmp.add');console.log(this); return a+b; }, sub:function (a,b) { return a-b; } }; var tmp2 = {
         dd:30, add:
    function (a,b) { console.log('tmp2.add');console.log(this); return a+b+5; } }; var res = tmp.add.call(tmp2,3,2); console.log(res); // 5 this.dd:30

    //即这里调用tmp.add方法,但是用tmp2对象来替换tmp的add方法执行时的this指向
    //示例2:
    function dog() {
        this.name = '小黑';
        this.showName = function (){
            console.log(this.name);  
            return this.name;
        }
    }
    
    function cat() {
        this.name = '小白';
    }
    
    var aDog = new dog();
    
    
    var res = aDog.showName.call(new cat() );
    console.log(res);  // 小白, 小白

    通过这样,可以实现js的继承,可以通过prototype(原型来实现继承),也可以直接通过call方法来实现继承

    function Animal(name){      
        this.name = name;      
        this.showName = function(){      
            alert(this.name);      
        }      
    }          
    function Cat(name){    
        Animal.call(this, name);    
    }      
        
    var cat = new Cat("Black Cat");     
    cat.showName(); 
    在Cat对象内调用了call方法,从而使this内扩展了Animal从而可以调用animal的方法
    
    也可以多次call 实现多重继承,但多次继承时,实例的this指向最后一行call的类
    
    function Animal(name){      
        this.name = 'animal';      
        this.showName = function(){      
            console.log(this.name);  
            console.log(name);
        }      
      console.log(arguments); // }
    function Mao(name) { this.name = 'mao'; } function Cat(name){ this.name = 'cat' Animal.call(this, name); Mao.call(this); } var cat = new Cat("Black Cat"); // 输出 arguments对象: ['Black Cat'] cat.showName(); // 输出 mao , Black Cat

    apply方法和call方法作用一样,但由于apply方法会自动把一个数组作为一个一个的参数传入进去,所以,apply可以有一些更巧妙的用法

    apply的特性应用如:

    1. Math.max 可以实现得到数组中最大的一项

    因为Math.max 参数里面不支持Math.max([param1,param2]) 也就是数组

    但是它支持Math.max(param1,param2,param3…),所以可以根据刚才apply的那个特点来解决 var max=Math.max.apply(null,array),这样轻易的可以得到一个数组中最大的一项

    2.Array.prototype.push 可以实现两个数组合并,同样push方法没有提供push一个数组,但是它提供了push(param1,param,…paramN) 所以同样也可以通过apply来装换一下这个数组,即

    vararr1=new Array("1","2","3");  

    vararr2=new Array("4","5","6");  

    Array.prototype.push.apply(arr1,arr2); 

     

  • 相关阅读:
    内核并发管理---spin lock
    redhat samba安装配置
    内核系统调用接口分析
    kernel makefile
    你知道C#中的Lambda表达式的演化过程吗?
    农码一生博文索引
    那些年搞不懂的术语、概念:协变、逆变、不变体
    Asp.Net生命周期
    ASP.NET配置文件Web.config 详细解释
    加盐密码哈希:如何正确使用
  • 原文地址:https://www.cnblogs.com/isdom/p/webclips039.html
Copyright © 2011-2022 走看看