简明易懂的call apply

在iteye看到一篇对call解释得相当简明易懂,觉得得宣传一下 : http://uule.iteye.com/blog/1158829

一、方法的定义

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例

function add(a,b)
{
    alert(a+b);
}function sub(a,b)
{
    alert(a-b);
}

add.call(sub,3,1);

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

b例

function Animal(){  
    this.name = "Animal";  
    this.showName = function(){  
        alert(this.name);  
    }  
}  

function Cat(){  
    this.name = "Cat";  
}  
 
var animal = new Animal();  
var cat = new Cat();  
  
//通过call或apply方法,将原本属于Animal对象的showName()方法交给对象cat来使用了。  //输入结果为"Cat"  animal.showName.call(cat,",");  
//animal.showName.apply(cat,[]);

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

c、实现继承

 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();

d、多重继承

function Class10()
{    this.showSub = function(a,b)
    {
        alert(a-b);
    }
}function Class11()
{    this.showAdd = function(a,b)
    {
        alert(a+b);
    }
}function Class2()
{
    Class10.call(this);
    Class11.call(this);
}

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

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

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

时间: 2024-08-27 19:34:27

简明易懂的call apply的相关文章

Adaboost算法原理分析和实例+代码(简明易懂)

Adaboost算法原理分析和实例+代码(简明易懂) [尊重原创,转载请注明出处] http://blog.csdn.net/guyuealian/article/details/70995333     本人最初了解AdaBoost算法着实是花了几天时间,才明白他的基本原理.也许是自己能力有限吧,很多资料也是看得懵懵懂懂.网上找了一下关于Adaboost算法原理分析,大都是你复制我,我摘抄你,反正我也搞不清谁是原创.有些资料给出的Adaboost实例,要么是没有代码,要么省略很多步骤,让初学者

史上最简明易懂非递归遍历二叉树算法

巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 遍历二叉树的递归函数是体现了算法之美的高妙算法,思路清晰,代码简洁,读之赏心悦目.代码例如以下: 程序代码: void PreOrderTraverse_R(BiTree BT)//採用递归方式先序遍历二叉树BT { if(BT != NULL) { printf("%c", BT->data);//输出该结点(根结点) PreOrderTraverse_R(BT->lchi

简明易懂的理解排列组合公式

说实话,我可能无意识中总是感觉自己数学不好,有时自己稍微陌生的数学内容就尽量的逃避,这哪能行,必须要去面对的.我又不是搞数学的研究,咱只是去应用就行了. 下面是知乎降解排列组合公式比较透彻的一个帖子 https://www.zhihu.com/question/26094736

面向连接的Socket Server的简单实现(简明易懂)

一.基本原理 有时候我们需要实现一个公共的模块,需要对多个其他的模块提供服务,最常用的方式就是实现一个Socket Server,接受客户的请求,并返回给客户结果. 这经常涉及到如果管理多个连接及如何多线程的提供服务的问题,常用的方式就是连接池和线程池,基本流程如下: 首先服务器端有一个监听线程,不断监听来自客户端的连接. 当一个客户端连接到监听线程后,便建立了一个新的连接. 监听线程将新建立的连接放入连接池进行管理,然后继续监听新来的连接. 线程池中有多个服务线程,每个线程都监听一个任务队列,

频繁被询问的apply和call

在iteye看到一篇对call解释得相当简明易懂,觉得得宣传一下 : http://uule.iteye.com/blog/1158829 一.方法的定义 call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象. 如果没有提供 this

AngularJS之备忘与诀窍

译自:<angularjs> 备忘与诀窍 目前为止,之前的章节已经覆盖了Angular所有功能结构中的大多数,包括指令,服务,控制器,资源以及其它内容.但是我们知道有时候仅仅阅读是不够的.有时候,我们并不在乎那些功能机制是如果运行的,我们仅仅想知道如何用AngularJS去做实现一个具体功能. 在这一章中,我么视图给出完整的样例代码,并且对这些样例代码仅仅给出少量的信息和解释,这些代码解决是我们在大多数Web应用中碰到的通用问题.这些代码没有具体的先后次序,你尽可以跳到你关心的小节先睹为快或者

对FlexLite和MoreUI的评价

两者都是Actionscript开发的UI组件库. 都比Flex组件库"轻"很多. FlexLite基本沿袭了Flex的Spark组件框架的结构设计(失效机制,延迟渲染,皮肤等),去除了一些功能.从而变得"轻". MoreUI基本结构和Flex3时代的mx组件框架的结构设计类似,没有将皮肤功能分离出来.与Flex组件相比,属性.功能减少了很多,从而变得"轻". 我对两者的评价: 1. FlexLite 优点: 提供了界面编辑器. 提供了一系列开发

为什么选择360全景项目进行创业

360全景技术已经有几年历史,许多360全景展示应用并未真正体现虚拟导览的优势所在,画面质量差,拍摄业余.从广义上讲,360全景就是视角超过人的正常视角的图像,而我们这里说的全景特指水平视角360度,垂直视角180度的图像.全景实际上只是一种对周围景象以某种几何关系进行映射生成的平面图片,只有通过360全景播放器的矫正处理才能成为360全景.如上例所示,360全景顾名思义就是给人以三维立体感觉的实景360度全方位图像,此图像最大的三个特点是: 专业拍摄装备,高清晰的质量保证 专业360全景摄影师

麦肯锡入职培训第一课

第一章 逻辑思考并不难 麦肯锡的“真正的逻辑思考”是“批判性思考(通过深刻洞察得 出自己的想法),逻辑性展开(用简单易懂的方式表达)”,至于具体 的思考过程,通过接下来的 3 个步骤 Step1 亲自确认前提条件(这是真的吗?) Step2 深入调查证据(……所以会这样) Step3 持有属于自己的意见(这个不错) 第二章 批判性思考 深入思考的核心不要把“关联关系”和“因果关系”混为一谈看事情不要流于表面 批判性思考的3个基本方法1 明确目的是什么 2 明确思维模式框架 3 不断发问(所以呢?