1.基本定义
JavaScript标准对基于对象的定义:“语言和宿主的基础设施由对象来提供,并且ECMAScript程序即是一系列互相通讯的对象集合”。
2.对象有如下几个特点。
- 对象具有唯一标识性:即使完全相同的两个对象,也并非同一个对象。【一般而言,各种语言的对象唯一标识性都是用内存地址来体现的】
- 对象有状态:对象具有状态,同一对象可能处于不同状态下。【不同语言会使用不同的术语来抽象描述对象的“状态和行为,比如C++中称它们为“成员变量”和“成员函数”,Java中则称它们为“属性”和“方法”。在 JavaScript中,将状态和行为统一抽象为“属性”】
- 对象具有行为:即对象的状态可能因为它的行为产生变迁。【JavaScript中对象独有的特色是:对象具有高度的动态性,这是因为JavaScript赋予了使用者在运行时为对象添改状态和行为的能力。】
3.JavaScript的属性分为数据属性和访问器属性
(getter/setter)两类。
- 数据属性
(1)数据属性具有四个特征。
value:就是属性的值。
writable:决定属性能否被赋值。
enumerable:决定for in能否枚举该属性。
configurable:决定该属性能否被删除或者改变特征值。
我们通常用于定义属性的代码会产生数据属性,其中的writable、enumerable、configurable都默认为true。我们可以使用内置函数 Object.getOwnPropertyDescripter来查看
- 访问器(getter/setter)属性
(1)数据属性具有四个特征。
· getter:函数或undefined,在取属性值时被调用。
· setter:函数或undefined,在设置属性值时被调用。
· enumerable:决定for in能否枚举该属性。
· configurable:决定该属性能否被删除或者改变特征值。
(2)在创建对象时,也可以使用 get 和 set 关键字来创建访问器属性,代码如下所示:
var o = { get a() { return 1 } };\n\nconsole.log(o.a);
访问器属性跟数据属性不同,每次访问属性都会执行getter或者setter函数。这里我们的getter函数返回了1,所以o.a每次都得到1。
4.总结
实际上JavaScript 对象的运行时是一个“属性的集合”,属性以字符串或者Symbol为key,以数据属性特征值或者访问器属性特征值为value。对象是一个属性的索引结构(索引结构是一类常见的数据结构,我们可以把它理解为一个能够以比较快的速度用key来查找value的字典)。我们以上面的对象o为例,你可以想象一下“a”是key。