在前面的几篇博客中学习到了ECMAScript-262的几种基本数据类型,接下来要学习的就是复杂的数据类型Object、Array、Date、RegExp、Function、基本包装类型和内置对象7种类型,复杂数据类型又称为引用类型。在ECMAScript中,引用类型是一种数据结构,用于将数据和功能组织在一起。在其他如Java、C#等面向对象的语言中它被称为类(class)。但因为ECMAScript不具备传统的面向对象语言所支持的类和接口等基本结构,因此,在ECMAScript中将其称为类不是很合适。
Object类型
在ECMAScript中,Object是其他一切类型的基类,好比Java中的java.lang.Object。仅仅创建Object类型的实例是没有什么意义的,但关键是理解上面那句话的思想,即Object是js中的基类。Object的每个实例都具有下列的属性和方法:
constructor构造函数—保存用于创建当前对象的函数。如下面的代码实例,对象obj的constructor值是function Object()
<script type="text/javascript"> var obj = new Object(); var cons = obj.constructor; document.write(cons); //function Object() </script>
hasOwnProperty(propertyName)—用于检测给定的属性是否在当前对象实例中(而不是在对象实例的原型中)。其中,作为参数名称的propertyName必须是以字符串形式指定。
<script type="text/javascript"> var obj = new Object(); var flag = obj.hasOwnProperty("name"); var cons = obj.constructor; document.write(cons); //function Object() </script>
isPrototypeOf(object)—用于检测传入的对象是否是另一个对象的原型。关于原型的知识将在后续博客中介绍。
propertyIsEnumerable(propertyName)—用于检测给定的属性能否使用for-in语句来枚举。与hasOwnProperty()方法一样,作为参数的属性名需以字符串形式指定。
toString()—返回对象的字符串表示;
valueOf()—返回对象的字符串、数值或布尔值表示。
创建Object类型实例的方式有两种:
- new操作符;
function test(){ var person = new Object(); person.name = "Hello World!"; person.age = 23; }
在使用new操作创建新对象时,如果不给构造函数传递参数,那么可以省略后面的那一对圆括号,但是不推荐,如下代码实例所示:
function test(){ var person = new Object(); var obj = new Object; person.name = "Hello World!"; person.age = 23; }
- 对象字面量表示法。
var person = { name : "Hello World!", age : 12 }
在上面代码可以看出来,不同的属性之间用逗号隔开,但是最后一个属性后面没有逗号。如果在最后一个属性后面也加了逗号,会在IE和Opera中导致错误。在对象字面量中,属性名也可以是字符串,如
var obj = { "name":"hello world", "age":12 }
使用对象字面量语法时,如果大括号留空,则可以定义只包含默认方法和属性的对象,起作用和使用new操作符创建对象而不添加属性和方法相同,如下代码
var person = {} // 等同于var person = new Object();
在通过对象字面量定义对象时,实际上不会调用Object的构造函数,firefox除外。
一般来说,访问对象属性都是使用点(.)表示法,在很多的编程语言中都使用这个方法,但在ECMAScript中有另一种表示方法,就是使用方括号,但是在使用方括号时,要将要访问的属性以字符串的形式放在方括号中。如下代码实例所示:
document.write(person.name); document.write(person.age); document.write(person["name"]); document.write(person["age"]);