Object对象的属性、方法
一、元属性
value: undefined
,该属性的属性值
writable: true
,是否可被修改
enumerable: true
,是否可枚举。如果设为false,会使得某些操作(比如for...in循环、Object.keys())跳过该属性
configurable: false
,可配置性。如果设为false,将阻止某些操作改写该属性,比如无法删除该属性,也不得改变该属性的属性描述对象(value属性除外)
get: undefined
,取值函数(getter)
set: undefined
,存值函数(setter)
- 当使用了getter或setter方法,不允许使用writable和value这两个属性(如果使用,会直接报错)
二、对象上的方法
1、Object.defineProperty(obj, prop, desc)
- 直接在一个对象上定义新的属性或修改现有属性,并返回该对象
obj
:要定义属性的对象
prop
:要定义或修改的属性的名称
desc
:要定义或修改的属性描述符,一般是一个对象(元属性)
const a = { name: 'aaa' };
Object.defineProperty(a, 'age', {
value: 18,
})
console.log(a.age);
2、Object.defineProperties(obj, props)
- 直接在一个对象上定义新的属性或修改现有属性,并返回该对象
obj
:要定义属性的对象
props
:属性描述对象
const obj = Object.defineProperties({}, {
p1: { value: 123 },
p2: { value: 'abc' },
p3: { get: function () { return this.p1 + this.p2 } }
});
obj.p1
obj.p2
obj.p3
3、Object.getOwnPropertyDescriptor(obj, prop)
- 返回指定对象上一个自有属性对应的属性描述符,不能用于继承的属性
obj
:要查询的目标对象
prop
:要查询的属性名称
const obj = { name: 'zhang' }
Object.getOwnPropertyDescriptor(obj, 'name')
4、Object.getOwnPropertyNames(obj)
const obj = { name: "zhang" }
Object.getOwnPropertyNames(obj)
5、Object.prototype.propertyIsEnumerable(prop)
- 判断给定的属性是否可枚举
- 继承原型对象的属性不可遍历
const obj = { name: "zhang" }
obj.propertyIsEnumerable('name')
obj.propertyIsEnumerable('toString')
三、控制对象状态
1、Object.preventExtensions()
使得一个对象无法再添加新的属性
Object.isExtensible()
检查是否可以为一个对象添加属性
var obj = new Object();
Object.isExtensible(obj)
Object.preventExtensions(obj);
Object.isExtensible(obj)
2、Object.seal()
使得一个对象既无法添加新属性,也无法删除旧属性
Object.isSealed()
检查一个对象是否使用了Object.seal方法
var obj = { name: 'AndyZhang' };
Object.seal(obj);
Object.isSealed(obj)
3、Object.freeze()
使得一个对象无法添加新属性、无法删除旧属性、也无法改变属性的值
Object.isFrozen()
检查一个对象是否使用了Object.freeze方法
var obj = { name: 'AndyZhang' };
Object.freeze(obj);
Object.isFrozen(obj)