首先区分两种说法:

    • 函数对象:将函数作为对象使用时,称为函数对象
    • 实例对象:new 函数生成的返回值,作为实例对象,简称对象

    当前存在这样一行代码:

    1. function Foo(){}

    当前函数 Foo 是作为函数出现,那么当前可以把 Foo 叫做构造函数吗?

    不行。原因就是目前并不明确该函数是以何种形式调用的。只有当它被 new 调用时,才能被称为构造函数。不管它名字是否首字母大写。被 new 以后,得到的返回值被称为实例对象,通常简称为对象或实例:

     let f = new Foo(); // f 就是实例对象
    

    就好比当前需要一个 zhangsan 这个人对象,就可以通过 new Person 得到一个实例:

     function Person(){}
     let zhangsan = new Person();
    

    接着说回到 Foo 上,假设当前需要得到 Foo.prototype 表示需要得到 Foo 的原型,既然能有 . 则表示一定跟对象有关,就好比访问 obj.name、student.age 一样,那么此时,Foo 就被称为函数对象。回忆一下以前学过的访问函数的形参个数使用的 foo.length,是不是也是在将函数当作函数对象来使用的?同理可得,访问 arr.length 那么当前数组也被称为数组对象。

    同样,在 Foo.call() 中,Foo 所担任的,还是函数的角色吗?不是,是充当的函数对象的角色。可以被读作调用函数对象 Foo 的 call 方法。

    最终总结出,函数既可以当作函数使用 foo()、new foo(),也可以当作对象使用 foo.length、foo.prototype、foo.call()。

    今天是虎年除夕,下午闲着没事儿写个短文档,阅读文章的你,新年快乐呀~