Js整理备忘(03)——对象基础

概念:对象表示“已命名的数据的无序集合”,这些已命名的数据通常被称为对象的属性,属性可以是任何类型的数据(数组、函数、对象…)。

对象中的函数通常被称为该对象的方法

类型:对象是复合数据类型,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中非常重要的概念,后面的学习几乎都离不开对象,本节先写到这里。
 
posted on 2010-01-12 15:05  lihua好心情  阅读(293)  评论(0编辑  收藏  举报