函数属性和方法:length和prototype

ECMAScript中的函数是对象,因此函数也有属性和方法。每个函数都包含两个属性:engthprototype

其中, length属性表示函数希望接收的命名参数的个数 .

function box1(name,sex){
        return name+sex;
    }
    alert(box1.length);

PS: 对于prototype属性, 它是保存所有实例方法的真正所在, 也就是原型。 这个属性,我们将在面向对象一章详细介绍。 而prototype下有两个方法: apply()call(), 每个函数都
包含这两个非继承而来的方法。这两个方法的用途都在特定的作用域中调用函数, 实际上等于设置函数体内this对象的值 .

    function box(num1,num2){
        return num1+num2;//原函数
    }
    function sayBox(num1,num2){
        return box.apply(this,[num1,num2]);//this表示作用域,这里是window
        //[]表示box所需要的参数
    }
    function sayBox1(num1,num2){
        return box.apply(this,arguments);//arguments对象表示box所需要的参数

    }
    alert(sayBox(10,20)); //30
    alert(sayBox1(10,15)); //25

call()方法于 apply()方法相同, 他们的区别仅仅在于接收参数的方式不同。 对于 call()方法而言,第一个参数是作用域,没有变化,变化只是其余的参数都是直接传递给函数的 .

    function box(num1,num2){
        return num1+num2;//原函数
    }
    function sayBox(num1,num2){
        return box.call(this,num1,num2);//和 apply区别在于后面的传参

    }
    alert(sayBox(10,20)); //30

事实上,传递参数并不是 apply()call()方法真正的用武之地;它们经常使用的地方是能够扩展函数赖以运行的作用域 。

var color="red";
var box={
    color:"green"
};
function test(){
    alert(this.color);
}
test();//作用域在 window,输出为'red';
test.call(window);//作用域在 window,输出为'red';
test.call(this);//作用域在 window,输出为'red';
test.call(box);//作用域在box,对象冒充,输出为'green';

使用 call()或者 apply()来扩充作用域的最大好处,就是对象不需要与方法发生任何耦合关系(耦合,就是互相关联的意思,扩展和维护会发生连锁反应)。也就是说, box对象和sayColor()方法之间不会有多余的关联操作,比如 box.sayColor = sayColor 。


 

 



 



 

posted @ 2017-05-13 17:24  代码小精灵  阅读(419)  评论(0编辑  收藏  举报