JS中的call()和apply()方法

来源:互联网 发布:淘宝店怎么做百度推广 编辑:程序博客网 时间:2024/05/01 00:48

JS中的call()和apply()方法

    博客分类: 
  • JS
 

1、方法定义

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

apply方法: 

语法:apply([thisObj[,argArray]]) 
定义:应用某一对象的一个方法,用另一个对象替换当前对象。 
说明: 
如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。 
如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。

 

2、常用实例

a、

Java代码  收藏代码
  1. function add(a,b)  
  2. {  
  3.     alert(a+b);  
  4. }  
  5. function sub(a,b)  
  6. {  
  7.     alert(a-b);  
  8. }  
  9.   
  10. add.call(sub,3,1);   

 这个例子中的意思就是用 add 来替换 sub,add.call(sub,3,1) == add(3,1) ,所以运行结果为:alert(4); // 注意:js 中的函数其实是对象,函数名是对 Function 对象的引用。

 

b、

Java代码  收藏代码
  1. function Animal(){    
  2.     this.name = "Animal";    
  3.     this.showName = function(){    
  4.         alert(this.name);    
  5.     }    
  6. }    
  7.   
  8. function Cat(){    
  9.     this.name = "Cat";    
  10. }    
  11.    
  12. var animal = new Animal();    
  13. var cat = new Cat();    
  14.     
  15. //通过call或apply方法,将原本属于Animal对象的showName()方法交给对象cat来使用了。    
  16. //输入结果为"Cat"    
  17. animal.showName.call(cat,",");    
  18. //animal.showName.apply(cat,[]);  

 call 的意思是把 animal 的方法放到cat上执行,原来cat是没有showName() 方法,现在是把animal 的showName()方法放到 cat上来执行,所以this.name 应该是 Cat

 

c、实现继承

Java代码  收藏代码
  1. function Animal(name){      
  2.     this.name = name;      
  3.     this.showName = function(){      
  4.         alert(this.name);      
  5.     }      
  6. }      
  7.     
  8. function Cat(name){    
  9.     Animal.call(this, name);    
  10. }      
  11.     
  12. var cat = new Cat("Black Cat");     
  13. cat.showName();  

 Animal.call(this) 的意思就是使用 Animal对象代替this对象,那么 Cat中不就有Animal的所有属性和方法了吗,Cat对象就能够直接调用Animal的方法以及属性了.

 

d、多重继承

Java代码  收藏代码
  1. function Class10()  
  2. {  
  3.     this.showSub = function(a,b)  
  4.     {  
  5.         alert(a-b);  
  6.     }  
  7. }  
  8.   
  9. function Class11()  
  10. {  
  11.     this.showAdd = function(a,b)  
  12.     {  
  13.         alert(a+b);  
  14.     }  
  15. }  
  16.   
  17. function Class2()  
  18. {  
  19.     Class10.call(this);  
  20.     Class11.call(this);  
  21. }  

 很简单,使用两个 call 就实现多重继承了
当然,js的继承还有其他方法,例如使用原型链,这个不属于本文的范畴,只是在此说明call 的用法。说了call ,当然还有 apply,这两个方法基本上是一个意思,区别在于 call 的第二个参数可以是任意类型,而apply的第二个参数必须是数组,也可以是arguments
还有 callee,caller..

 

例子来源:http://xiaofeizm55333.iteye.com/blog/80913

http://www.iteye.com/topic/599108   及回复..

分享到:  
JSP自定义标签 | 问题总结
  • 2011-08-26 15:55
  • 浏览 161731
  • 评论(18)
  • 分类:Web前端
  • 相关推荐
评论
18 楼 菜花码农 2015-05-21  
1.function Animal(){    
2.    this.name = "Animal";    
3.    this.showName = function(){    
4.        alert(this.name);    
5.    }    
6.}    
7.  
8.function Cat(){    
9.    this.name = "Cat";    
10.}    
11.   
12.var animal = new Animal();    
13.var cat = new Cat();    
14.    
15.//通过call或apply方法,将原本属于Animal对象的showName()方法交给对象cat来使用了。    
16.//输入结果为"Cat"    
17.animal.showName.call(cat,",");    
18.//animal.showName.apply(cat,[]);  

call 的意思是把 animal 的方法放到cat上执行,原来cat是没有showName() 方法,现在是把animal 的showName()方法放到 cat上来执行,所以this.name 应该是 Cat。

“call 的意思是把 animal 的方法放到cat上执行”这个应该是animal.showName调用时候,将animal中的this对象转变为cat,alert(this.name);这时候的this是cat,因此this.name==cat.name,所以输出是Cat
17 楼 菜花码农 2015-05-21  
function add(a,b)
{
    alert(a+b);
}
function sub(a,b)
{
    alert(a-b);
}

add.call(sub,3,1); 
个人理解call和apply的作用就是切换函数的对象上下文

“这个例子中的意思就是用 add 来替换 sub“,应该是将add执行的上下文由window切换为sub,即this指向是从window变为sub,仅此而已,并非add替换sub。这个例子很难说明什么。
16 楼 菜花码农 2015-05-21  
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();

这个段代码解释存在误区,首先执行var cat = new Cat("Black Cat");进入function Cat(name){  
     Animal.call(this, name);  
}
这时候的this为Cat{}对象,并非Animal,再接执行function Animal(name){    
     this.name = name;    
     this.showName = function(){    
         alert(this.name);    
     }    
}
此时的this对象绑定为Cat{},因此是Cat对象获得了两个属性为:Cat{name:"Black Cat",showName:function(){    
         alert(this.name);    
     }},回到var cat=Cat{name:"Black Cat",showName:function(){    
         alert(this.name);    
     }}最后才是cat.showName();
15 楼 ae6623 2015-04-24  
lar429608598 写道
ae6623 写道
Js代码  收藏代码
  1. add.call(sub,3,1); //这个是说 sub已经继承了add的方法,可以调用add的方法了。  
  2. animal.showName.call(cat,",");   //这个是说 cat 已经继承了animal的方法了,虽然cat木有showName这个方法,但是通过call,已经把参数都传给了cat,cat直接调用继承到的showName()方法即可  
  3.   
  4. 楼主,最后一个双继承不知道什么意思,暂时还不理解你为什么不说继承,而是一直在谈,谁把谁的方法交给了谁,感觉很难懂啊,继承就一下子清晰了。  




很遗憾的说,你理解的完全都是错的。。
add.call(sub,3,1); 你要这么理解:
还是调用的add(3, 1); 但是,在add这个函数执行的时候,当前的上下文this已经不是add对象的了,而是sub对象的。



跟this没啥关系啊,其实就是call方法前面的东西(add)都交给后面(sub)了,就像兄弟,接过这把枪。

add.call(sub,3,1) // sub 已经接过了add方法
14 楼 siegezhang 2015-04-21  
function add(a,b)  
{  
    alert(a+b);  
}  
function sub(a,b)  
{  
    alert(a-b);  
}  
  
add.call(sub,3,1);   

这个这样理解会更好一点:

将this的值绑定为sub,而add函数中的alert(a+b)执行与this无关,故还是与原来的不绑定保持一致。
13 楼 qq_21706873 2015-03-14  
                                                   
12 楼 whx0820 2015-01-28  
wyx177694333 写道
shileigong 写道

...
这个段中不太明白这个的意思
animal.showName.call(cat,",");  

这样写为什么不行呢?
animal.call(cat,",").showName();  


貌似你理解错了,animal 是没有call方法的,如果存在这种写法大概是这样的:

Js代码  收藏代码
  1. function Animal(){      
  2.     this.name = "Animal";      
  3.     this.showName = function(){      
  4.         alert(this.name);      
  5.     }  
  6.     // [color=red]添加了call方法[/color]  
  7.     this.call = function (o){  
  8.         var temp_name = this.name;  
  9.         this.name = o.name;  
  10.         o.showName = this.showName;  
  11.         this.name = temp_name;  
  12.         return o;  
  13.     };    
  14. }      
  15.   
  16. function Cat(){      
  17.     this.name = "Cat";      
  18. }  
  19.   
  20. var animal = new Animal();      
  21. var cat = new Cat();      
  22.    
  23. animal.call(cat,",").showName();  


call()方法是Function对象的方法,animal是个变量,所以没有call()方法.这样理解对么?
11 楼 wohenni0931 2015-01-01  
按照自己的理解能力来讲,实例a真心没什么用,还有种乱指路的感觉。其他的很容易理解,顶一个!
10 楼 dolphin_gjh 2014-12-04  
很不错,学习了。
9 楼 wyx177694333 2014-09-28  
shileigong 写道

...
这个段中不太明白这个的意思
animal.showName.call(cat,",");  

这样写为什么不行呢?
animal.call(cat,",").showName();  


貌似你理解错了,animal 是没有call方法的,如果存在这种写法大概是这样的:

Js代码  收藏代码
  1. function Animal(){      
  2.     this.name = "Animal";      
  3.     this.showName = function(){      
  4.         alert(this.name);      
  5.     }  
  6.     // [color=red]添加了call方法[/color]  
  7.     this.call = function (o){  
  8.         var temp_name = this.name;  
  9.         this.name = o.name;  
  10.         o.showName = this.showName;  
  11.         this.name = temp_name;  
  12.         return o;  
  13.     };    
  14. }      
  15.   
  16. function Cat(){      
  17.     this.name = "Cat";      
  18. }  
  19.   
  20. var animal = new Animal();      
  21. var cat = new Cat();      
  22.    
  23. animal.call(cat,",").showName();  
8 楼 shileigong 2014-08-10  
function Animal(){    
    this.name = "Animal";    
    this.showName = function(){    
        alert(this.name);    
    }    
}    
  
function Cat(){    
    this.name = "Cat";    
}    
   
var animal = new Animal();    
var cat = new Cat();     
animal.showName.call(cat,",");    

这个段中不太明白这个的意思
animal.showName.call(cat,",");  

这样写为什么不行呢?
animal.call(cat,",").showName(); 
7 楼 xiaoting5555 2014-07-25  
很好啊,易懂
6 楼 lar429608598 2014-07-18  
ae6623 写道
Js代码  收藏代码
  1. add.call(sub,3,1); //这个是说 sub已经继承了add的方法,可以调用add的方法了。  
  2. animal.showName.call(cat,",");   //这个是说 cat 已经继承了animal的方法了,虽然cat木有showName这个方法,但是通过call,已经把参数都传给了cat,cat直接调用继承到的showName()方法即可  
  3.   
  4. 楼主,最后一个双继承不知道什么意思,暂时还不理解你为什么不说继承,而是一直在谈,谁把谁的方法交给了谁,感觉很难懂啊,继承就一下子清晰了。  




很遗憾的说,你理解的完全都是错的。。
add.call(sub,3,1); 你要这么理解:
还是调用的add(3, 1); 但是,在add这个函数执行的时候,当前的上下文this已经不是add对象的了,而是sub对象的。
5 楼 ae6623 2014-07-07  
Js代码  收藏代码
  1. add.call(sub,3,1); //这个是说 sub已经继承了add的方法,可以调用add的方法了。  
  2. animal.showName.call(cat,",");   //这个是说 cat 已经继承了animal的方法了,虽然cat木有showName这个方法,但是通过call,已经把参数都传给了cat,cat直接调用继承到的showName()方法即可  
  3.   
  4. 楼主,最后一个双继承不知道什么意思,暂时还不理解你为什么不说继承,而是一直在谈,谁把谁的方法交给了谁,感觉很难懂啊,继承就一下子清晰了。  


4 楼 softor 2014-06-30  
实例a有什么实际意义?
3 楼 we3613040 2014-06-17  
[b][b]       [/b][/b]
2 楼 tryhl 2013-09-24  
 很好 很详细
1 楼 shi_yun 2013-04-17  
写的明白易懂,学习了。
发表评论
0 0
原创粉丝点击