js积累三

来源:互联网 发布:目前java主流开发框架 编辑:程序博客网 时间:2024/04/30 11:52

五、函数里的属性与方法

函数中几个重要的属性:arguments,this,caller,prototype.
1,关于this属性,其与Java,C#中的this类似---谁调用该方法,那方法里的this对象便指向谁。
2,caller属性
ECMAScript5规范了另一个函数对象的属性:caller。除了Opera的早期版本不支持,其他浏览器都支持。
这个属性保存着调用当前函数的函数的引用,如果在全局作用域中调用当前函数,caller的值为null.
functon outer(){
   inner();
}
function inner(){
    alert(inner.caller);//或者这样写:alert(arguments.callee.caller);
 }
outer();
调用outer方法后,会弹出outer方法的源码
3,prototype属性
对于引用类型而言,prototype是保存它们所有实例方法的真正所在,换句话说,诸如toString()与valueof()等方法实际上都
保存在prototype名下,只不过是通过各自对象的实例访问而已,关于prototype以后再说明下。

4,call与apply方法
这两个方法的用途都是在特定的作用域中调用函数,相当于设置函数体内的this对象的值.apply方法接收两个参数:一个是在
其中运行的作用域,另一个是参数数组(可以是Array实例,也可以是arguments对象),比如:

function sum (num1,num2){
   return num1 + num2;
}
function callSum1(num1,num2){
   return sum.apply(this,arguments);//这里的this相当于window对象,下同。
}
function callSum2(num1,num2){
   return sum.apply(this,[num1,num2])

}

alert(callSum1(10,10));
alert(callSum2(10,10));

而call与apply的唯一区别是:call必须明确传入每一个参数。

call与apply强大的地方是能够扩充函数赖以运行的作用域:
 window.color = "red";
 var o = {color : blue};
 function sayColor(){
    alert(this.color);
}

sayColor.call(window);//red
sayColor.call(this);  //red
sayColor.call(o);     //blue

使用call或apply扩充作用域的最大好处,就是对象不再需要与方法有任何耦合关系:

window.color = "red";
var o = {color : blue};

function sayColor(){
    alert(this.color);
}
sayColor();//red

o.sayColor = sayColor;
o.sayColor();//blue
在最后的两行代码中,我们是先将sayColor函数放到了对象o中,然后再通过o来调用的,这样就不方便了。
0 0
原创粉丝点击