什么是对象?这里有很多关于对象的定义:
- 对象(object)是一件事、一个实体、一个名词,是可以获得的东西,是可以想象的能够有自己标识的任何东西。
- 对象是类的实例化。
- 对象是一些相关的变量和方法的软件集合。
Java和C++里面的对象似乎都要使用class定义之后,然后在new出来一个。很简单,很明了。但是在JavaScript中,却并没有class这个定义。那么,JavaScript中就没有对象了吗?当然不是的!请看对象的定义,谁说对象就必须像Java或者C++一样定义呢?
先看一下Java中的定义:
C++中的?吭吭,那就看看吧:
大同小异不是?早就说过的……
那么,JavaScript的呢?大概也类似吧?
嗯,这不差不多嘛?嗯嗯,JavaScript是弱类型的,所以使用var声明变量,而不需要在声明时指定类型。然后,new操作符,创建一个……Object?这是什么?
在JavaScript的版本中,对象user并不是一个User类的实例!甚至,我们根本就没有定义一个类!按照Java的观点,Object是所有类的父类。我们创建的自己的user对象是一个Object类型的?然后,我们并没有声明name属性,怎么它就有了呢?
嗯,让我们换种写法试试:
这也行?晕死了!还有写法吗?嗯,看看这个:
唉,连那个可怜的Object都不见了,怎么就一个{}?不过,仔细看看,一个键,一个值,咋这么耳熟呢?这个写法像是……二元组?
没错,就是二元组!二元组是类似于<K, V>的东西,其中K代表键,V代表值。典型的二元组就是数组:K是int类型的,V是你定义的数组元素的类型。更普遍一些的就是散列,也就是数据结构中的哈希表(HashMap)。可以看出,散列实际上就是广义的数组,只不过它的索引index并不一定是int类型。
再来看看JavaScript中的对象定义:那不明显是二元组的定义吗?name : "User",就是K : V的形式。这样看来,JavaScript中的对象,就相当于是二元组!在JavaScript中,对象只是一组键值对(听上去耳熟?那不就是二元组的定义吗?),就是说,JavaScript中的对象可以看做以字符串为K的二元组(或许这个名字听起来很别扭,数学味道太浓了。那么,不妨就把它叫做散列,或者哈希表,或者是Python中的字典吧)。我们可以使用熟悉的"."(点运算符)或者[]运算符,来获取和设置对象的属性。这正是Python以及其他一些语言在处理字典数据结构时通常采用的方法。
还有一点,你一定已经注意到,JavaScript中对象的属性比Java和C++中更为灵活:你可以随意添加并不存在的属性!就像上面代码中的name!不过,如果你已经充分理解了JavaScript的对象就是二元组这个结论的话,这一点儿都不会让你感到惊讶。因为你就是在向二元组中添加新的元组嘛……添加一个新的键,以及这个键对应的值……嗯,这和Java中的HashMap的put(key, value)有什么区别吗?反正我看不出来……噢噢,除了语法上的区别……
嗯,这就是面向对象的JavaScript需要解决的第一个问题,什么是对象,怎样创建JavaScript的对象。已经和经典的面向对象语言有所不同了,不是吗?