对象与属性
对象分类
- 内置对象
- 非构造器对象(Math、JSON)
- 构造器对象(Object、Array、Function、Number…)
- 宿主对象
- 由宿主环境确定的
- 自定义对象
- 用户自己创建的
属性的种类
- 数据属性
- 对象的普通属性,从键到值的映射(包括方法)。
- 访问器属性
- 类似于读、写 。
- 内置属性
- 不能直接访问,可能存在间接访问方式,内置属性的键置于方括号中。
数据属性及其特性
属性特征
- value:对应属性的值
- writable:确定属性是否可改写性
- configurable:确定属性是否能删除和其他特性是否可配置
- enumerable:属性是否可枚举
属性描述符
- 属性描述符是用来查看对象属性的特性的对象,该对象包含4个属性,对应4个特性
- 封装了属性特性的对象,方便实现数据属性特性的设置和查询
属性特性
- 设置
- 单数:Object.defineProperty(obj,prop,decsription)
- obj — 要在其上定义属性的对象
- prop — 要定义或修改的属性
- description — 将被定义或修改的属性描述符
- 复数:Object.defineProperties()
- 单数:Object.defineProperty(obj,prop,decsription)
- 查询
- 单数:Object.getOwnPropertyDescriptor()
- 全部:Object.getOwnPropertyDescriptors()
四种属性
四种属性默认性
- value 默认为 undefined
- enmuerable、writable、configurable默认为false
- 字面量定义默认为 true
var obj = {PI:3.14}; Object.getOwnPropertyDescriptor(obj,"PI");
枚举性
- 特性
- 一般来说,系统创建的属性不可枚举,用户创建的属性可枚举
- 枚举的主要目的是判断 for-in 循环中的哪些属性应该被忽略
- 枚举影响的操作
- for-in循环
for(var key in obj)
- Object.keys(obj),这是个方法要传参
- JSON.stringify(),只有可枚举的才能用
- for-in循环
obj.propertyIsEnumerable(prop)
- 返回一个布尔值表示指定的属性是否可枚举
可配置性
- 一旦把
configurable
变成false,就不可以配置了,利用Object.defineProperty
只可以修改writable
这个属性,其他都不可以修改了
其他方法
Object.isExtensible()
- 新创建的对象默认是可扩展的
Object.preventExtensions()
- 变成不可扩展后,用传统的方式不可为其添加属性
Object.isSealed()
Object.seal()
- 密封之后,返回的是原对象
- 密封之后,任何值除修改属性以外的操作都会失败
Object.isForzen()
Object.freeze()
- 冻结之后, 返回的是原对象
- 冻结之后,只有删除属性是成功的
访问器属性及其特性
访问器属性
- get:读取属性时调用的函数,默认是undefined
- set:设置属性时调用的函数,默认是undefined
- configurable
- enumerable