函数对象

  函数也有方法和属性,可以把函数理解为一种特殊的对象,函数进行typeof操作返回的结果是function。 函数名就是函数对象的索引,通过函数名可以调用函数,通过函数名可以执行new操作创建一个对象。 字符串对象、数组对象可以通过通过Javascript语言内置的特定构造函数Array()、String()去创建。 使用function关键字可以创建各种各样自定义的构造函数,Array()、String()构造函数对比自己定义的构造函数而言 可以理解为专用的构造函数。

函数对象属性

arguments

  函数对象的属性arguments是一个类似数组的对象,表示函数的参数,可以使用下标的方式访问参数,arguments和数组对象一样具有length属性。 可以查看下面代码,查看arguments的使用方式。

    let X = 0;
    function fun(a,b,c) {
        //arguments[0]、arguments[1]、arguments[2]可以分别表示参数a,b,c。
        let s = arguments[0] + arguments[1] + arguments[2];
        document.write(s);
        document.write("<br>");
        for(let i =0;i<arguments.length;i++){   //arguments.length表示参数个数
            X += arguments[i];
        }
        document.write(X);
        document.write("<br>");
    }
    fun(1,2,3); 

  arguments使用范围是函数内,可以直接调用。arguments[1]表示函数第二个参数,不需要用“函数名.arguments[1]”的形式,就像全局对象的方法可以直接使用,可以省略全局对象。

属性 意义
arguments.length arguments对象长度,即函数参数个数
arguments.callee 指向函数,等价于函数名字,可以用来调用函数

length

  函数对象和数组对象、字符串对象一样具有length属性,函数对象的length属性表示函数参数,可以在函数体外使用。执行语句“函数名.length”就可以返回函数参数个数, 无参函数返回0.

方法

call()

  call()可以把一个对象的方法和属性绑定到另一个对象,另一个对象就具有了这个对象的方法和属性。

call的语法格式:对象名1.(对象名2,对象1的参数1,对象1的参数2....),表示把对象1绑定到对象2

    function fun(a,b) {

    }
    obj = {

    };
    fun.call(obj,a,b);

  参考前面的课程《继承》,可以把对象冒充方法案例代码中的第18行第19行代码删掉替换为 Base.call(this);,Base函数没有参数,所有call不需要写第一个参数以外的参数,call的第一个参数是将要绑定的对象,使用this指的是构造函数huo。

替换后的代码

    //基类(霍去病、岳飞共同的属性)
    function Base(){
        this.nation = "汉";
        this.country = "中国";
        this.job = "军人";
    }

    //huo构造函数
    function huo() {
        Base.call(this);//
        this.name = "霍去病";
        this.dynasty = "汉";
    }

    //yue构造函数
    function yue() {
        Base.call(this);
        this.name = "岳飞";
        this.dynasty = "宋";
    }

    let extend1 = new huo();
    let extend2 = new yue();
    //页面显示对象extend1的dynasty属性值
    document.write(extend1.dynasty);
    document.write("<br>");
    //页面显示对象extend2的country属性值
    document.write(extend2.country);
    document.write("<br>");

apply()

  apply()和call()功能没有任何区别,区别在于格式稍有不同,原函数的参数a、b....,以数组的形式出现

    function fun1(a,b) {

    }
    obj = {

    };
    fun.call(obj,[a,b]);