0%

手写object.freeze

object.freeze()=不可扩展(preventExtensions)+不可配置(configurable:false)+不可写(writable:fasle)

object.seal()=不可扩展+不可配置

preventExtensions=不可添加属性+不可改__proto__

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
const _objectFreeze = object => {
// 补全代码
//Object.defineProperty(object,)
const props=Object.getOwnPropertyNames(object);
props.forEach(prop=>{
const des=Object.getOwnPropertyDescriptor(object,prop);
if(des.get||des.set){
Object.defineProperty(object,prop,{
configurable:false,//小写
writable:false,
get:des.get,
set:des.set

})
}else{
Object.defineProperty(object,prop,{
configurable:false,
writable:false,

})

}

})
return Object.preventExtensions(object);

}

数据属性的值不可更改,访问器属性(有getter和setter)也同样(但由于是函数调用,给人的错觉是还是可以修改这个属性)。如果一个属性的值是个对象,则这个对象中的属性是可以修改的,除非它也是个冻结对象。数组作为一种对象,被冻结,其元素不能被修改。没有数组元素可以被添加或移除。

这个方法返回传递的对象,而不是创建一个被冻结的副本。