使用面向对象技术创建高级Web应用程序

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中的函数实际上就是对象,只不过这个对象具有同其相关联的一段可执行代码。请看下面这段再普通不过的代码:

1 function func(x) {
2     alert(x);
3 }
4 func("blah");

这是JavaScript中定义函数最常用的方式了。但是,你还可以先创建一个匿名函数对象再将该对象赋值给变量func,也即,象下面那样,定义出完全相同的函数

1 var func = function(x) {
2     alert(x);
3 };
4 func("blah2");

或者甚至通过使用Function构造器,向下面这样来定义它:

1 var func = new Function("x", "alert(x);");
2 func("blah3");

这表明,函数实际上就是一个支持函数调用操作的对象。最后这种使用Function构造器来定义函数的方式并不常用,但却为我们带来很多很有趣的可能,其原因可能你也已经发现了,在这种函数定义的方式中,函数体只是Function构造器的一个字符串型的参数。这就意味着,你可以在JavaScript运行的时候构造出任意的函数。

要进一步证明函数是对象,你可以就象为任何其它JavaScript对象一样,为函数设置或添加属性:

1 function sayHi(x) {
2     alert("Hi, " + x + "!");
3 }
4  
5 sayHi.text = "Hello World!";
6 sayHi["text2"] = "Hello World... again.";
7  
8 alert(sayHi["text"]); // displays "Hello World!"
9 alert(sayHi.text2); // displays "Hello World... again."

 

作为对象,函数还可以赋值给变量、作为参数传递给其它函数、作为其它函数的返回值、保存为对象的属性或数组中的一员等等。

posted @ 2013-07-05 15:28  人人枫  阅读(166)  评论(0编辑  收藏  举报