对象的定义
对象是javascript的基本数据类型,对象是一种复合值:它将很多值(原始值或者其他对象)聚合在一起,可通过名字访问这些值。对象也可看做是属性的无序集合,每个属性都是一个名/值对。这种基本数据结构有很多种叫法,比如散列(hash)、散列表(hashtable)、字典(dictionary)、关联数组(associative array)。javascript对象的区别于其它语言中类似对象数据结构的本质特征是:javascript对象还可以从一个成为原型的对象继承属性,即“原型式继承”(prototypal inheritance)。
对象拥有三个相关的对象特性(object attribute)
- 对象的原型(prototype):原型对象指向另外一个对象,本对象的属性继承自它的原型对象
- 对象的类 (class):是一个标志对象类型的字符串
- 对象的扩展标记(extensible flag):指明了是否可以向该对象添加新属性
对象的属性包含名字和值,属性名是可以包含空字符串在那的任意字符串,但对象中不能存在两个同名的属性名。属性值可以是任意javascript值,或者是一个getter或setter函数(ECMAScript 5特性)
对象的属性还有一些与之相关的值,称为“属性特性”(prototype attribute)
- 可 写 性(wtitable attribute):表明是否可以设置该属性的值
- 可枚举性(enumerable attribute):表明是否可以通过for/in循环反悔该属性
- 可配置性(configurable attribute):表明是否可以删除或者修改该属性
javascript中对象有三大类:
- 内置对象(native object):是由ECMAScript规范定义的对象或类,例如,数组,函数,日期,正则表达式都是内置对象
- 宿主对象(host object):是由javascript解释器所嵌入的宿主环境(比如web浏览器)定义的。例如,表示网页结构的HTMLElement对象均是宿主对象。由于宿主环境定义的方法可以当成普通的javascript函数对象,宿主对象也可以当成内置对象。
- 自定义对象(user-defined object):是有运行中javascript代码创建的对象,例如
var a = {} ;
对象的属性也可分为两类:
- 自有属性(own prototype):是直接在对象中定义的属性
- 继承属性(inherited prototype):是在对象的原型对象中定义的属性
创建对象
在javascript中,有三种方式可以创建对象:
对象直接量
- 属性名可以是javascript标志符也可以是字符串直接量(包括空字符串)例如:
var a = { b: 2 , '' : 3 } ;
- 保留字用作属性名,必需用引号(ECMAScript 5中可以不用引号),例如:
var a = { "for" : 4 } ;
- 对象直接量中的最后一个属性后的逗号分隔符将被忽略(ECMAScript 5特性),而且大部分ECMAScipt 3的实现都支持忽略逗号,但是在老版本IE中会报错( 我印象中貌似ie8以及以下版本 )。例如:
var a = { b : 2 , } ;
- 属性名可以是javascript标志符也可以是字符串直接量(包括空字符串)例如:
使用关键字new
- new运算符创建并初始化一个新对象。关键字new后跟随一个函数调用。这里的函数被称为构造函数(constructor)。构造函数用以初始化一个新创建的对象。例如:
var a = new Object() ;// 创建一个空对象,和{}一样
- new运算符创建并初始化一个新对象。关键字new后跟随一个函数调用。这里的函数被称为构造函数(constructor)。构造函数用以初始化一个新创建的对象。例如:
Object.create()(ECMAScript 5特性)
- 一个静态函数,用以创建一个对象,其中第一个参数是这个对象的原型,第二个可选参数,用以对对象的属性进行进一步描述。
var o1 = Object.create( { x : 1 , y : 2 } ) ;// o1继承了属性x和y
- 第一个参数若为null,则创建一个没有原型的新对象,不会继承任何东西,包括基础方法,比如toString(),所以它将不能和“+”运算符一起正常工作。
- 创建普通空对象,
var o3 = Object.create( Object.prototype ) ; // o3和{}和new Object() 一样
- 一个静态函数,用以创建一个对象,其中第一个参数是这个对象的原型,第二个可选参数,用以对对象的属性进行进一步描述。
一些特性:
- 所有通过对象直接量创建的对象都具有同一个原型对象,可用Object.prototype获得原型对象的引用
- 通过关键字new创建的对象的原型就是构造函数的prototype属性的值,
var a = new Array() ;// a的原型对象就是Array.prototype
- 没有原型对象的对象为数不多,Object.prototype就没有原型对象,它不继承任何属性。其它原型对象都是普通对象,普通对象都具有原型;(null,也是没有原型对象的对象,个人理解)
- 所有内置构造函数(以及大部分自定义的构造函数)都具有一个继承自Object.prototype的原型(即,所有内置构造函数的原型对象都继承自Object.prototype )。例如:new Date()创造的对象同时继承Date.prototype和Object.prototype,这一系列的原型对象就是所谓的“原型链”(prototype chain)
例6-1:通过原型继承创建一个新对象
|
|
inherit函数不能完全替代Object.cteate() , 它不能传入null为原型创建对象,而且不能接受可选的第二个参数
才写了两小节 未完待续