AJAX入门之深入理解JavaScript函数(2)
运行代码可以发现,第一个alert语句显示为1,即表示数组对象拥有属性p1,而func调用则显示为“undefined”,即p1不是arguments的属性,由此可见,arguments并不是一个数组对象。
函数的apply、call方法和length属性
javascript为函数对象定义了两个方法:apply和call,它们的作用都是将函数绑定到另外一个对象上去运行,两者仅在定义参数的方式有所区别:
function.prototype.apply(thisarg,argarray);
function.prototype.call(thisarg[,arg1[,arg2…]]);
从函数原型可以看到,第一个参数都被取名为thisarg,即所有函数内部的this指针都会被赋值为thisarg,这就实现了将函数作为另外一个对象的方法运行的目的。两个方法除了thisarg参数,都是为function对象传递的参数。下面的代码说明了apply和call方法的工作方式:
//定义一个函数func1,具有属性p和方法a
function func1(){
this.p="func1-";
this.a=function(arg){
alert(this.p+arg);
}
}
//定义一个函数func2,具有属性p和方法b
function func2(){
this.p="func2-";
this.b=function(arg){
alert(this.p+arg);
}
}
var obj1=new func1();
var obj2=new func2();
obj1.a("bya"); //显示func1-bya
obj2.b("byb"); //显示func2-byb
obj1.a.apply(obj2,["bya"]); //显示func2-bya,其中[“bya”]是仅有一个元素的数组,下同
obj2.b.apply(obj1,["byb"]); //显示func1-byb
obj1.a.call(obj2,"bya"); //显示func2-bya
obj2.b.call(obj1,"byb"); //显示func1-byb
可以看出,obj1的方法a被绑定到obj2运行后,整个函数a的运行环境就转移到了obj2,即this指针指向了obj2。同样obj2的函数b也可以绑定到obj1对象去运行。代码的最后4行显示了apply和call函数参数形式的区别。
与arguments的length属性不同,函数对象还有一个属性length,它表示函数定义时所指定参数的个数,而非调用时实际传递的参数个数。例如下面的代码将显示2:
function sum(a,b){
return a+b;
}
alert(sum.length);
深入认识javascript中的this指针
this指针是面向对象程序设计中的一项重要概念,它表示当前运行的对象。在实现对象的方法时,可以使用this指针来获得该对象自身的引用。
和其他面向对象的语言不同,javascript中的this指针是一个动态的变量,一个方法内的this指针并不是始终指向定义该方法的对象的,在上一节讲函数的apply和call方法时已经有过这样的例子。为了方便理解,再来看下面的例子:
<script language="javascript" type="text/javascript">
<!--
//创建两个空对象
var obj1=new object();
var obj2=new object();
//给两个对象都添加属性p,并分别等于1和2
obj1.p=1;
obj2.p=2;
//给obj1添加方法,用于显示p的值
obj1.getp=function(){
alert(this.p); //表面上this指针指向的是obj1
}
//调用obj1的getp方法
obj1.getp();
//使obj2的getp方法等于obj1的getp方法
obj2.getp=obj1.getp;
//调用obj2的getp方法
obj2.getp();
//-->
</script>
从代码的执行结果看,分别弹出对话框显示1和2。由此可见,getp函数仅定义了一次,在不同的场合运行,显示了不同的运行结果,这是有this指针的变化所决定的。在obj1的getp方法中,this就指向了obj1对象,而在obj2的getp方法中,this就指向了obj2对象,并通过this指针引用到了两个对象都具有的属性p。
由此可见,javascript中的this指针是一个动态变化的变量,它表明了当前运行该函数的对象。由this指针的性质,也可以更好的理解javascript中对象的本质:一个对象就是由一个或多个属性(方法)组成的集合。每个集合元素不是仅能属于一个集合,而是可以动态的属于多个集合。这样,一个方法(集合元素)由谁调用,this指针就指向谁。实际上,前面介绍的apply方法和call方法都是通过强制改变this指针的值来实现的,使this指针指向参数所指定的对象,从而达到将一个对象的方法作为另一个对象的方法运行。
每个对象集合的元素(即属性或方法)也是一个独立的部分,全局函数和作为一个对象方法定义的函数之间没有任何区别,因为可以把全局函数和变量看作为window对象的方法和属性。也可以使用new操作符来操作一个对象的方法来返回一个对象,这样一个对象的方法也就可以定义为类的形式,其中的this指针则会指向新创建的对象。在后面可以看到,这时对象名可以起到一个命名空间的作用,这是使用javascript进行面向对象程序设计的一个技巧。例如:
var namespace1=new object();
namespace1.class1=function(){
//初始化对象的代码
}
var obj1=new namespace1.class1();
这里就可以把namespace1看成一个命名空间。
由于对象属性(方法)的动态变化特性,一个对象的两个属性(方法)之间的互相引用,必须要通过this指针,而其他语言中,this关键字是可以省略的。如上面的例子中:
obj1.getp=function(){
alert(this.p); //表面上this指针指向的是obj1
}
这里的this关键字是不可省略的,即不能写成alert(p)的形式。这将使得getp函数去引用上下文环境中的p变量,而不是obj1的属性。
http://www.cnblogs.com/skylaugh/archive/2006/12/18/595572.html
文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。