概念:对象表示“已命名的数据的无序集合”,这些已命名的数据通常被称为对象的属性,属性可以是任何类型的数据(数组、函数、对象…)。
对象中的函数通常被称为该对象的方法。
类型:对象是复合数据类型,typeof()运算后返回类型为object
特点:属性数量可以无限多,属性名为标识符或字符串,属性值可以为任意类型的数据。
1、对象的创建
(1)使用对象直接量,例下面的对象 stu 就是一个对象直接量:
<script type="text/javascript" language="javascript"> var stu = { id: 12, //属性名通常是一个Js标识符 name: "object", "age": 20, //属性名也可以用字符串表示 hobby: ["football", "drawing", "swimming"], //属性值可以是任意类型 other: {a:1,b:"a sample"} }; document.write(stu.hobby); //结果显示:football,drawing,swimming </script>
(2)使用new运算符
new运算符创建具体的一类对象,例:
<script type="text/javascript" language="javascript"> var o = new Object(); //创建一个空对象 var a = new Array(1,2,"asd"); //创建一个数组对象 var s = new String("a string"); //创建一个字符串对象 o.x = 123; o.str = "asd"; //给对象o添加属性,此处的x与str是标识符 document.write(o.str); //输出"asd" </script>
这里的Object()、Array()、String()都是核心Javascript(以下简称Js)的一部分,另外常用的还有Date()、RegExp()等。
(3)使用自定义的构造函数创建对象
要理解这种方式,首先要对构造函数的概念有一个认识,从字面上不难判断,构造函数的类型应该为函数(function)。实际上,上文(2)中所用的Object,Array,String本身都是一个构造函数。如:typeof (Object); typeof (Array); typeof(String); 返回类型都为function;
构造函数可以用来创建对象,创建的对象实例的类型为object。
如:typeof(o); typeof(a); typeof(s); 返回类型都为object。
先举个简单的例子说明这种创建方法:
functionfn() {this.x = "x";}//定义一个简单的函数fn
varfo = newfn(); //创建构造函数fn的一个对象实例fo
理论上,任何函数都可以作为构造函数来创建对象实例,函数与对象之间的关系非常微妙,由于目前对函数了解还不够深入,以后会详细说明。
有兴趣的话可以看看这篇文章:为什么Object.prototype.isPrototypeOf(Function)是true
2、对象的存取
Javascript(以下简称Js)对象的存取方式有两种:object.property 或者 object["property"]。最大的区别是:前者的属性名是标识符;后者的属性名是字符串。
标识符不是一种数据类型,使用时必须逐字输入,且程序不能对其操作;而字符串是Js的一种数据类型,因此可以在程序运行的过程中对其操作。
关联数组(associative array)
如果使用一个对象时采取object["property"] 这种形式,我们常常称它为关联数组,它是一个数据结构,允许动态将任意字符串和任意类型的数据关联。
例如要读取某个对象的所有属性时,用点"."操作就显得不太合理,因为"."后面的属性名(标识符)必须事先知道是如何拼写的。而用"[]"则可以很方便地做到。
<script type="text/javascript" language="javascript"> var obj = { id: 12, name: "object", "age": 24,
hobby: ["football", "drawing", "swimming"],
other: {a:1,b:"a sample"} }; for (p in obj) { document.write(p + ":" + obj[p]+" ; "); //此处p是个变量,不用管它究竟表示哪个具体的字符串 } </script>
页面显示结果为:id:12 ; name:object ; age:24 ; hobby:football,drawing,swimming ; other:[object Object] ;
3、对象中通用且比较重要的属性和方法
明确一个概念:Js中所有对象都继承自Object类。
(1)constructor(构造函数) 属性
Js中每个对象都具有该属性,它引用该对象的构造函数。
例如:var d=new Date(); 那么 d.constructor 引用构造函数Date(即表达式d.constructor==Date值为true)。
由此可见,constructor属性有助于确定该对象的类型。例如:
if((typeof o == "object") && (o.constructor == Date))
在上一篇介绍的运算符中提到 instanceof 运算符,也用于确定对象的类型。上面的写法也可以如下:
if((typeof o == "object") && (o instanceof Date)) // 若o为Date的一个对象实例,则返回true
要对constructor属性有更深入的了解,可以参考一下这篇文章:再补点基础:Javascript的构造函数和constructor属性
(2)isPrototypeOf()方法
说明:如果isPrototypeOf()方法所属的对象是参数的原型对象,则该方法返回true
原型(prototype)也是Js中比较复杂而又非常的重要的概念,一开始可能会很难理解,此处也不适合详细说明,只能大概了解。举几个例子:
<script type="text/javascript" language="javascript"> var o = {}; alert(Object.prototype.isPrototypeOf(o)); //true: o.constructor==Object alert(Function.prototype.isPrototypeOf(Object));//true: Object.constructor==Function </script>
关于Object和Function的关系,可以参考为什么Object.prototype.isPrototypeOf(Function)是true
对象是Js中非常重要的概念,后面的学习几乎都离不开对象,本节先写到这里。