在很多语言中,函数或者方法和对象是两个截然不同的概念。函数是对象可以进行的动作。在面向对象理论中,函数是由对象发起的消息。对象之间的通讯需要通过消息进行,而这个消息就是我们定义的对象。
但是在JavaScript中,函数和对象的概念就没有那么明确了。可以这么理解,函数就是具有与之相关联的可执行的代码的对象。先来看一个普通的例子:
这是最普遍的函数定义的方式,看上去似乎和Java、C++没有什么区别:首先定义一个函数,使用了function关键字(尽管Java和C++中并没有这么个关键字),然后紧跟着的是函数体。定义完毕之后就可以调用了——一切都显得那么的顺理成章。不过,JavaScript是灵活的,它还提供了另外的一种定义函数的方式:
有点好玩了,不是吗?这个函数看上去就像是对象的定义:首先定义一个匿名函数,然后将它赋值给一个变量,使用这个变量就可以对函数进行调用了。嗯,这还不是很明显,看看下面的:
这回已经很像对象的定义了吧?使用new运算符创建一个Function对象,仔细看看构造函数的两个参数,这不就是我们的函数参数和代码吗?这已经表名,JavaScript的函数只是支持函数调用语法的对象。函数就是一个Function类型的对象。尽管比较怪异,但是这也给出了我们一个有益的启示:你可以在运行时使用Function创建一个函数!
既然是对象,我们就可以对函数进行任何对象的操作,比如增加属性等等。
喏!那不明显就是一个普通的对象嘛~~不过对象还可以做的更多,比如赋值给变量、作为参数传递给其他函数、作为其它函数的返回值、作为对象的属性、组合成为数组等等,这些函数都可以吗?
有趣的是,在JavaScript中这些都是可以做到的!并且就像是普通的对象一样,并没有什么不同!了解到这一点后,我们就可以很方便的向JavaScript对象中添加函数:
看似简单的代码其实有更深的含义:这是JavaScript中实现面向对象的基本特征之一——封装——的基本方式。