Object.defineProperty及seal freeze相关函数总结

Object.defineProperty用法

语法

Object.defineProperty(obj, prop, descriptor)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//对象已有的属性添加特性描述
Object.defineProperty(obj,"test",{
get:function (){} | undefined,
set:function (value){} | undefined,
configurable:true | false,
enumerable:true | false,
value:任意类型的值,
writable:true | false
});
//对象新添加的属性的特性描述
Object.defineProperty(obj,"newKey",{
get:function (){} | undefined,
set:function (value){} | undefined,
configurable:true | false,
enumerable:true | false,
value:任意类型的值,
writable:true | false
});

参数含义

value:属性对应的值
writable:属性的值是否可以被重写
enumerable:属性是否可以被枚举(for…in 或者Object.keys())
configurable:是否可以删除目标属性或是否可以再次修改属性的特性(writable,configurable,enumerable)
get/set:

1
2
3
4
5
6
7
8
9
10
Object.defineProperty(obj,"newKey",{
get:function (){
//当获取值的时候触发的函数
return initValue;
},
set:function (value){
//当设置值的时候触发的函数,设置的新值通过参数value拿到
initValue = value;
}
});

Object.preventExtensions()

阻止对象扩展,让一个对象永远不能再添加新的属性

1
Object.preventExtensions(obj)

Object.isExtensible()

判断一个对象是否可扩展,返回true/false

Object.seal()

不能添加新的属性
不能删除已有属性
不能修改已有属性的enumerable,configurable,writable,但可以修改已有属性的值

返回被密封后的对象

Object.isSealed()

判断是否被密封

Object.freeze()

在seal的基础上不能修改属性的值

Object.isFrozen()

判断一个对象是否被冻结