zoukankan      html  css  js  c++  java
  • JS call与apply

    JS的call与apply

    call和apply是JS中比较重要的两个方法, 一般在框架和组件设计中用的较多,比如jQuery Code。 那么这两个方法是做什么的呢,下面我们通过代码来了解:

    复制代码
    1 function f(){
    2       console.log(this.name);
    3  }
    4 
    5  var obj = {};
    6  obj.name = "obj";
    7 
    8  f.call(obj); //obj
    复制代码

    f()中输出了this.name, 这里的this指的是函数在运行时的调用者(关于JS中的this,请参考:JS作用域和this关键字),因此f()输出的结果取决于调用它的对象。

    obj 是javascript中的一个普通对象,obj.name = "obj"; 是在obj上添加了一个属性name,并赋值"obj"。  一般情况下,只有obj能访问自己的属性name,f为何能访问到obj.name呢?

    call方法的作用就体现在这里:

    f.call(obj) 翻译成白话文就是:在obj对象的执行空间调用f(), 相当于obj.f() ,此时f中的this指的就是obj, this.name相当于obj.name,所以输出"obj"。

    这是对call方法最简单的解释。

    call还有个兄弟apply, apply 和 call 唯一的区别是传递参数形式不同,call(obj,args..) 可以传递一个参数列表, apply(obj,args[]) 只能传递一个Array参数。

    当然,这兄弟俩还有其他作用,那就是JS中的继承。

    JS中没有诸如Java、C#等高级语言中的extend 关键字,因此JS中没有继承的概念,如果一定要继承的话,call和apply可以实现这个功能:

    复制代码
     1 function Animal(name,weight){
     2        this.name = name;
     3        this.weight = weight;
     4   }
     5 
     6   function Cat(){
     7        Animal.call(this,'cat','50');
     8        //Animal.apply(this,['cat','50']);
     9 
    10        this.say = function(){
    11            console.log("I am " + this.name+",my weight is " + this.weight);
    12        }
    13   }
    14 
    15   var cat = new Cat();
    16   cat.say();//I am cat,my weight is 50
    复制代码

    从输出结果看,Cat 确实继承了Animal中的属性, 继承的关键在于 Animal.call(this,'cat','50') 这句话!

    翻译成白话文就是:在执行Cat()时,先在其调用对象this的执行空间调用Animal(),相当于this.Animal()。this.Animal()执行完以后,this上就产生了name和weight属性,而say方法的调用者也是this,因此say()中访问的this.name就是Animal中的name属性。所以输出的是Animal的属性值。

    var cat = new Cat();

    这句话执行之后,this就是cat, cat.say() 就相当于this.say() 。

  • 相关阅读:
    作为一个非计算机专业的人,你们是怎样进入IT行业的?
    第一次写博客
    变卖
    近2周关于Shadowing的总结
    二十九岁步入而立之年的思考
    最美的回忆漫天的雪
    有趣的房东夫妇
    遥远的思恋—我的儿子
    五年一轮回
    写在开工之前我的2010
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/5041633.html
Copyright © 2011-2022 走看看