引用类型的值(对象)是引用类型的一个实例。在 ES 中,引用类型是一种数据结构,用于将数据和功能组织在一起。引用类型也被称为对象定义,因为它们描述的是一类对象所具有的的属性和方法。
对象是某个特定引用类型的实例,新对象使用 new
操作符后跟一个构造函数来创建。构造函数本身是一个函数,只不过该函数是出于创建新对象的目的而定义的。请看下面的代码:
1 | var person = new Object(); |
这行代码创建了 Object 引用类型的一个新实例,然后把该实例保存在了变量 person
中。使用的构造函数是 Object
,它只为新对象定义了默认的属性和方法。
1.创建 Object 实例
Object 是 ES 中使用最多的一个类型,创建 Object 实例的方式有两种。第一种是使用 new
操作符后跟 Object
构造函数,如下所示:
1 | var person = new Object(); |
另一种方式是使用对象字面量表示法。对象字面量是对象定义的一种简写形式,目的在于简化创建包含大量属性的对象的过程。下面这个例子就使用了对象字面量语法定义了与前面那个例子中相同的 person
对象:
1 | var person = { |
在这个例子中,左边的花括号表示对象字面量的开始,因为它出现在了表达式上下文(expression context)中。ES 中的表达式上下文指的是能够返回一个值。赋值操作符表示后面是一个值,所以左花括号在这里表示一个表达式的开始。同样的花括号,如果出现在一个语句上下文(statement context)中,例如跟在 if 语句条件的后面,则表示一个语句块的开始。
在对象字面量中,使用逗号来分隔不同的属性,因此 "Nicholas"
后面是一个逗号。但是,在 age
属性的值后面不能添加逗号,因为 age
是这个对象的最后一个属性。在最后一个属性后面添加逗号,会在 IE7 及更早版本和 Opera 中导致错误。
在使用对象字面量语法时,属性名也可以使用字符串,如下面这个例子所示:
1 | var person = { |
这个例子会创建一个对象,包含三个属性:name
、age
和 5
。但这里的数值属性名会自动转换为字符串。
另外,使用对象字面量语法时,如果留空其花括号,则可以定义只包含默认属性和方法的对象,如下所示:
1 | var person = {}; // 与 new Object() 相同 |
这个例子与之前的例子是等价的。
在通过对象字面量定义对象时,实际上不会调用 Object 构造函数(Firefox2 及更早版本例外)。
使用对象字面量语法来定义对象,要求的代码量少,而且能够给人封装数据的感觉。实际上,对象字面量也是向函数传递大量可选参数的首选方式,例如:
1 | function displayInfo(args) { |
在这个例子中, 函数 displayInfo()
接受一个名为 args
的参数。这个参数可能带有一个名为 name
或 age
的属性,也可能这两个属性都有或者都没有。在这个函数内部,通过 typeof
操作符来检测每个属性是否存在,然后再基于相应的属性来构建一条要显示的消息。
这种传递参数的模式适合需要像函数传入大量可选参数的情形。一般来讲,命名参数虽然容易处理,但在有多个可选参数的情况下就会显示不够灵活。最好的做法是对那些必须值使用命名参数,而是用对象字面量来封装多个可选参数。
2.访问对象属性
一般情况下,访问对象属性时使用的都是点表示法,这也是很多面向对象语言中通用的语法。不过,在 JavaScript 中也可以使用方括号表示法来访问对象属性。在使用方括号语法时,应该将要访问的属性以字符串的形式放在方括号中,如下面的例子所示:
1 | alert(person["name"]); |
从功能上看,这两种访问对象属性的方法没有任何区别。但方括号语法的主要优点是可以通过变量来访问属性,例如:
1 | var propertyName = "name"; |
如果属性名中包含会导致语法错误的字符,或者属性名使用的是关键字或保留字,也可以使用方括号表示法。例如:
1 | person["first name"] = "Nicholas"; |
由于 "first name"
中包含一个空格,所以不能使用点表示法来访问它。然而,属性名中是可以包含非字母非数字的,这时候就可以使用方括号表示法来访问它们。
通常,除非必须使用变量来访问属性,否则建议使用点表示法。