`
ll_feng
  • 浏览: 392753 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

通过实例理解javascript 的call()与apply()

阅读更多
先前使用javascript多是为了表单验证,最多是实现客户端的交互功能。基本不用call、apply之类的难懂方法。
现在流行富客户端了。javascript也越来越对象化了。不得不学习一下!

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

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


二、例子程序:
<html>
<head>
<script language="javascript">
/**定义一个animal类*/
function Animal(){
	this.name = "Animal";
	this.showName = function(){
		alert(this.name);
	}
}
/**定义一个Cat类*/
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,[]);
 

</script>
</head>
<body></body>
</html>


以上代码无论是采用animal.showName.call或是animal.showName.apply方法,运行的结果都是输出一个"Cat"的字符串。说明showName方法的调用者被换成了cat对象,而不是最初定义它的animal了。这就是call和apply方法的妙用!

三、小结:
call和apply方法通常被用来实现类似继承一样的功能,以达到代码复用的功效。它们的区别主要体现在参数上。
分享到:
评论
9 楼 ll_feng 2010-03-01  
to rainsilence:
谢谢! 学习了。正在学习js面对象的知识,交流一下,受益不少!
8 楼 bingufo 2010-02-26  
果然很高深
7 楼 rainsilence 2010-02-25  
组合->继承->设计模式->创意,lz的路还有很远。。。加油吧
6 楼 rainsilence 2010-02-25  
模拟call, apply的this替换
function Animal(name){  
    this.name = name;  
    this.showName = function(){  
        alert(this.name);  
    };
};

function Cat(name){
	this.superClass = Animal;
	this.superClass(name);
	delete superClass;
}

var cat = new Cat("Black Cat");  

cat.showName();

5 楼 rainsilence 2010-02-25  
。。。。。。。。。。。你所写的,只是call和apply最基本的作用。根本不是面向对象

你代码的修改版(一般情况已经够用)
<html>  
<head>  
<script language="javascript">  

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

  
</script>  
</head>  
<body></body>  
</html>  


更完全版
<html>  
<head>  
<script language="javascript">  

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

function Cat(name){
	Animal.call(this, name);
}  

Cat.prototype = new Animal();

var cat = new Cat("Black Cat");  

cat.showName();

alert(cat instanceof Animal);

  
</script>  
</head>  
<body></body>  
</html>  


call和apply都是基于this替换。把this的语义转了
4 楼 vassilij 2010-02-25  
正好在学习,谢谢楼主
3 楼 iaimstar 2010-02-25  
看起来蛮有意思的

也很好理解
2 楼 containsoft 2010-02-24  
更了解了。thinks
1 楼 breezem 2010-02-23  
学习了 谢谢经验分享。

相关推荐

    关于Javascript中call与apply的进一步探讨

    `apply`方法与`call`类似,主要区别在于传递参数的方式。`apply`接受两个参数:第一个参数同样是`this`值,第二个参数是一个数组或类数组对象,其中的元素作为函数的参数: ```javascript func.apply(thisArg, ...

    Js的call与apply1

    虽然JavaScript不直接支持类继承,但通过`call`和`apply`,我们可以实现类似的效果。 首先,让我们深入理解`call`和`apply`的基本用法。`call`接收两个参数:第一个参数是希望作为`this`值的对象,后续参数以逗号...

    js中call与apply的用法小结

    JavaScript中的继承通常通过原型链实现,`call`和`apply`能帮助我们创建子类并继承父类的方法。例如: ```javascript function baseA() { // base Class A code } function childA() { baseA.call(this); // ...

    javascript中apply和call方法的作用及区别说明

    1、call,apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例(就是每个方法)都有call,apply属性。既然作为方法的属性,那它们的使用...

    Javascript - 全面理解 caller,callee,call,apply

    在JavaScript的世界里,caller、callee、call和apply是四个非常重要的概念,它们涉及到函数的调用方式和执行上下文。这些知识点对于深入理解和优化代码至关重要,尤其在处理高阶函数和面向对象编程时。 首先,让...

    Javascript call及apply应用场景及实例

    在JavaScript中,`call` 和 `apply` 是两个非常重要的函数,它们都是 `Function` 类型的实例方法。这两个方法的主要作用在于改变函数执行时的上下文(即 `this` 指向),这对于理解和实现面向对象编程(OOP)至关...

    javascript中call和apply方法浅谈

    例如,通过`call`或`apply`,我们可以借用构造函数创建新的实例,实现原型链上的继承。同时,它们也是实现某些高级技巧,如函数柯里化、部分应用和元编程的关键工具。 在实际开发中,理解和熟练掌握`call`和`apply`...

    JavaScript中call和apply方法的区别实例分析

    本文实例分析了JavaScript中call和apply方法的区别。分享给大家供大家参考,具体如下: 这两个方法不经常用,但是在某些特殊场合中是非常有用的,下面主要说下它们的区别: 1、首先,JavaScript是一门面向对象的语言...

    深化理解关于javascript中apply()和call()方法的区分_.docx

    在JavaScript中,`apply()`和`call()`方法都是用于改变函数调用时的上下文(即`this`关键字指向的对象)以及传递参数。这两个方法都隶属于`Function.prototype`,因此所有函数实例都拥有这两个方法。它们的主要作用...

    跟我学习javascript的call(),apply(),bind()与回调

    本文将详细解释JavaScript中call(), apply(), 和 bind() 方法的作用、语法以及使用场景,并且会探讨回调函数的使用,帮助理解这些概念在实际编程中的应用。 首先,我们来探讨call() 和 apply() 方法。这两个方法都...

    Javascript中call,apply,bind方法的详解与总结

    本文针对JavaScript中三个重要的函数方法——call、apply和bind,进行详尽的分析,并在文章的结尾部分对这三个方法之间的联系和区别进行了概括,以便于读者更深入地理解它们的用途和应用场景。 首先,我们来探讨...

    js中call与apply的用法小结.docx

    在JavaScript中,`call`和`apply`是两个非常重要的函数,它们都允许开发者改变函数执行时的上下文,即`this`的指向。这两个方法主要用于实现函数的绑定和继承,以及处理数组或类数组对象。 首先,我们来看`call`的...

    开启Javascript中apply、call、bind的用法之旅模式

    以下详细解释了apply、call以及bind的用法,并通过实例加深理解。 1. apply()和call()方法 apply()和call()方法都用于指定函数体内this的值。通过这两个方法,我们可以在调用函数时,动态地改变函数内部的this指向...

    javascript call和apply方法

    理解并熟练掌握`call`和`apply`方法是JavaScript进阶开发的关键,它们对于理解和操作对象、处理函数调用以及实现高级编程技巧至关重要。在日常开发中,正确使用这些方法可以帮助我们编写更加灵活和可维护的代码。

    从JQuery源码分析JavaScript函数的apply方法与call方法

    JQuery源码分析与JavaScript中的apply与call方法是JavaScript编程中非常重要的概念,这两者都是函数对象的方法,用于在特定的作用域中执行函数,并可以指定函数体内this的指向。从JQuery源码中分析apply和call方法,...

    Javascript 中的 call 和 apply使用介绍

    总的来说,`call`和`apply`是JavaScript中实现动态上下文绑定和灵活参数传递的重要工具,对于理解和使用JavaScript的高级特性,如原型继承、函数封装和异步处理等,具有至关重要的地位。掌握它们的用法能够极大地...

    实例讲解JavaScript中call、apply、bind方法的异同

    以实例切入,讲解JavaScript中call,apply,bind方法,供大家参考,具体内容如下 &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;title&gt;&lt;/title&gt; [removed] ...

    JavaScript函数Call、Apply原理实例解析

    这篇文章主要介绍了JavaScript函数Call、Apply原理实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一、方法重用 使用 call() 方法,您可以编写能够在...

    Javascript call和apply区别及使用方法

    ### Javascript call和apply区别及使用方法 在JavaScript中,`call`和`apply`方法被用于显式地设定函数体内`this`的值,这是所谓的函数借用(method borrowing)或函数上下文改变(context changing)。它们使得一...

Global site tag (gtag.js) - Google Analytics