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 => { 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)也同样(但由于是函数调用,给人的错觉是还是可以修改这个属性)。如果一个属性的值是个对象,则这个对象中的属性是可以修改的,除非它也是个冻结对象。数组作为一种对象,被冻结,其元素不能被修改。没有数组元素可以被添加或移除。
这个方法返回传递的对象,而不是创建一个被冻结的副本。