概念
ES对于对象的定义是:无序属性的集合,其属性可以包括基本值,对象或者函数。从中我们可以发现,js中的对象有下面的特征
- 无序的集合,这个就让js中的对象更像是散列表,是一系列无序的键值对的集合
- 属性包括基本值,对象或者函数。这个把属性可以包括哪些数据类型说的很清楚了
属性类型
ES中有下面两种属性
- 数据属性
- 访问器属性
顾名思义,数据属性可以保存一个数据值,而访问器属性本身不能保存数据值,但是可以通过getter setter进行访问控制,它的属性存储还需要额外的数据属性。
数据属性中值是如何存储的呢?我们就需要知道数据属性中的四个特性,事先说明,这四个属性的修改在日常开发中很难用到,但是对于我们理解数据属性为什么能够存值,对于理解对象大有益处。
数据属性拥有四个描述其特性的特性值,分别是:
- Configurable 是否可以配置,是否可以被删除等(注意一旦这个值设置了false,就再也不能修改配置了,连这个值也不能再进行设置了)
- Enumerable 是否可以使用for in枚举
- Writable 是否可写
- Value 存储其值,默认值是undefined,对于属性的读写操作其实是对于这个值的读写
我们需要注意一点,在严格模式下,对于设置了 不可配置或者不可写 特性的属性,对他们进行写操作会报错,在非严格模式下,不生效不报错。
我们使用Object.defineProperty来修改特征值,看下面的例子:
var person = {};
// 注意在设置的时候如果不指定,前三个特性默认值都是false,与默认不一致
Object.defineProperty(person, "name", {
writable: false,
value: "Nic"
});
alert(person.name);
person.name = "Pop"; // 严格模式下报错 Cannot assign to read only property 'name' of object '#<Object>'
alert(person.name);
与之相对应的,访问器属性也有四个特性