javascript属性描述结构
6个元属性
value
属性值,默认undefinedwritable
属性的值是否可写,默认trueenumerable
属性是否可遍历,默认trueconfigurable
属性是否可配置(属性描述对象的可写性,为false时value,writable,enumerable和configurable都不能被修改或者了,value除外),默认trueget
getter函数,默认undefinedset
setter函数,默认undefined
Object的方法
Object.getOwnPropertyDescriptor(对象,属性名)
用于获取属性描述对象
Object.getOwnPropertyDescriptors(对象)
用于获取所有属性描述对象
Object.defineProperty(对象,属性名,描述对象)
定义属性描述符
Object.defineProperties(对象,描述对象集)
Object.prototype.propertyIsEnumerable(属性)
判断对象自身的属性的可遍历性
PS:
- for…in只会遍历自身以及原型链上可遍历的属性,而in会遍历原型链上的属性。
- 在使用Object.definePropert() 定义属性描述符时,如果省略某个描述符,则该描述符默认为false
var obj={}
Object.defineProperty(obj,"b",{value:2,enumerable:false})
//省略了writable、configurable,obj.b的属性描述符为
//value:2,enumerable:false, writable:false, configurable: false;
对象的状态(三种)
Object.preventExtensions() 、Object.isExtensible()
扩展性(禁用无法添加新属性)属性描述符无变化Object.seal()、Object.isSealed()
不可配置了(configurable为false,无法添加新属性和删除旧属性)
//默认
{ value: '1',
writable: true,
enumerable: true,
configurable: true }
//执行Object.seal()后
{ value: '1',
writable: true,
enumerable: true,
configurable: false }
Object.freeze()、Object.isFrozen()
与Object的区别就是writable也为false,变成了常量
//默认
{ value: '1',
writable: true,
enumerable: true,
configurable: true }
//执行Object.freeze()后
{ value: '1',
writable: false,
enumerable: true,
configurable: false }
注意事项
- 冻结只能冻结对象本身,原型不受影响。
- 对象的属性是引用类型时,冻结的只是一个指针。