JavaScript对象是字典
在C++或C#中,当谈及对象时,我们指的是类或者结构的实例。对象根据实例化出它的模版(也即,类)的不同而具有不同的属性和方法。JavaScript对象不是这样的。在JavaScript中,对象仅仅是name/value对的集合,我们可以把JavaScript对象看作字典,字典中的键为字符串。我们可以用我们熟悉的"." (点)操作符或者一般用于字典的"[]"操作符,来获取或者设置对象的属性。下面的代码片段
1 |
var userObject = new Object(); |
2 |
userObject.lastLoginTime = new Date(); |
3 |
alert(userObject.lastLoginTime); |
同这段代码所做的完全是同样的事情:
1 |
var userObject = {}; // equivalent to new Object() |
2 |
userObject["lastLoginTime"] = new Date(); |
3 |
alert(userObject["lastLoginTime"]); |
我们还可以用这样的方式,直接在userObject的定义中定义lastLoginTime属性:
1 |
var userObject = { "lastLoginTime": new Date() }; |
2 |
alert(userObject.lastLoginTime); |
请注意这同C# 3.0的对象初始化表达式是多么的相似。另外,熟悉Python的读者会发现,在第二段和第三段代码中,我们实例化userObject的方式就是Python中指定字典的方式。这里唯一的区别的就是,JavaScript中的对象/字典只接受字符串作为键,而Python中字典则无此限制。
这些例子也表明,同C++或者C#对象相比,JavaScript对象是多么地更加具有可塑性。属性lastLoginTime不必事先声明,如果在使用这个属性的时候userObject还不具有以此为名的属性,就会在userObject中把这个属性添加进来。如果记住了JavaScript对象就是字典的话,你就不会对此大惊小怪了 —— 毕竟我们随时都可以把新键(及其对应的值)添加到字典中去。
JavaScript对象的属性就是这个样子的。那么,JavaScript对象的方法呢?和属性一样,JavaScript仍然和C++/C#不同。为了理解对象的方法,就需要首先仔细看看JavaScript函数。
JavaScript中的函数具有首要地位
在许多编程语言中,函数和对象一般都认为是两种不同的东西。可在JavaScript中,它们之间的区别就没有那么明显了 —— JavaScript中的函数实际上就是对象,只不过这个对象具有同其相关联的一段可执行代码。请看下面这段再普通不过的代码:
这是JavaScript中定义函数最常用的方式了。但是,你还可以先创建一个匿名函数对象再将该对象赋值给变量func,也即,象下面那样,定义出完全相同的函数
1 |
var func = function(x) { |
或者甚至通过使用Function构造器,向下面这样来定义它:
1 |
var func = new Function("x", "alert(x);"); |
这表明,函数实际上就是一个支持函数调用操作的对象。最后这种使用Function构造器来定义函数的方式并不常用,但却为我们带来很多很有趣的可能,其原因可能你也已经发现了,在这种函数定义的方式中,函数体只是Function构造器的一个字符串型的参数。这就意味着,你可以在JavaScript运行的时候构造出任意的函数。
要进一步证明函数是对象,你可以就象为任何其它JavaScript对象一样,为函数设置或添加属性:
2 |
alert("Hi, " + x + "!"); |
5 |
sayHi.text = "Hello World!"; |
6 |
sayHi["text2"] = "Hello World... again."; |
8 |
alert(sayHi["text"]); // displays "Hello World!" |
9 |
alert(sayHi.text2); // displays "Hello World... again." |
作为对象,函数还可以赋值给变量、作为参数传递给其它函数、作为其它函数的返回值、保存为对象的属性或数组中的一员等等。