JavaScript 的内部数据结构,用来描述一个对象的属性的行为,操控它的行为。这被称为“属性描述对象”(attributes object)。
{ value:‘momei‘, //存放该属性的属性值,默认为undefined writable:false, //存放一个布尔值,表示属性值是否可更改,默认值为true。 enumerable:true, //存放一个布尔值,表示该属性是可枚举的,默认为true。 configurable:false, //存放一个布尔值,表示“可配置性”,默认为true。控制属性描述的可写行、性。 get:undefined, //存放一个函数,表示该属性的取值函数(getter),默认为undefined。 set:undefined //存放一个函数,表示该属性的存值函数(setter),默认值undefined。 }
Object.defineProperty()
方法接受三个参数,第一个是属性所在的对象,第二个是属性名(它应该是一个字符串),第三个是属性的描述对象。
Object.defineProperty(object, propertyName, attributesObject)
如果一次性定义或修改多个属性,可以使用Object.defineProperties()
方法。
Object.getOwnPropertyDescriptor()
方法可以读出对象自身属性的属性描述对象。
var infor = { name: ‘墨眉‘ }; Object.getOwnPropertyDescriptor(infor, ‘name‘); // 输出 Object {value: "墨眉", writable: true, enumerable: true, configurable: true}
属性描述对象的属性,被称为“元属性”,因为它可以看作是控制属性的属性。
可枚举性(enumerable):
- 只有可枚举的属性,才会被for...in循环遍历。
- 原生集成的属性都是不可枚举的。
var o = {a: 1, b: 2}; o.c = 3; Object.defineProperty(o, ‘d‘, { value: 4, enumerable: false }); // 输出Object {a: 1, b: 2, c: 3, d: 4} for(var key in o) { console.log(o[key]); } //输出 1,2,3 ( d 不可枚举 )
可配置型(configurable):
- 可配置性(configurable)决定了是否可以修改属性描述对象。
- 当configurable为false的时候,value、writable、enumerable和configurable都不能被修改。
var conf = Object.defineProperty({}, ‘p‘, { value: 1, writable: false, enumerable: false, configurable: false }); Object.defineProperty(conf ,‘p‘, {value: 2}) // TypeError: Cannot redefine property: p Object.defineProperty(conf ,‘p‘, {writable: true}) // TypeError: Cannot redefine property: p Object.defineProperty(conf ,‘p‘, {enumerable: true}) // TypeError: Cannot redefine property: p Object.defineProperties(conf ,‘p‘,{configurable: true}) // TypeError: Cannot redefine property: p
可写性(writable):
- writable决定了属性的值(value)是否可以被更改。
var obj = {}; Object.defineProperty(obj, ‘a‘, { value: 37, writable: false }); obj.a // 37 obj.a = 25; obj.a // 37
Object.getOwnPropertyNames()
方法返回直接定义在某个对象上面的全部属性的名称,而不管该属性是否可枚举。
Object.prototype.propertyIsEnumerable() 判断一个属性是否可以枚举。
存取器(accessor)
- 除了直接定义,属性还可以用存取器(accessor)定义。
- 存值函数称为setter,使用set命令;取值函数称为getter,使用get命令。
控制对象状态
- Object.preventExtensions() 可以是的一个对象无法再添加行的属性。
Object.isExtensible()
方法用于检查一个对象是否使用了Object.preventExtensions()
方法。也就是说,检查是否可以为一个对象添加属性。
- Object.seal() 使得一个对象既无法添加新属性,也无法删除旧属性。
Object.isSealed()
方法用于检查一个对象是否使用了Object.seal()
方法
- Object.freeze() 方法可以使得一个对象无法添加新属性、无法删除旧属性、也无法改变属性的值、使得这个对象实际上变成常量。
Object.isFrozen()
方法用于检查一个对象是否使用了Object.freeze()
方法。
时间: 2024-10-19 03:05:29