Javascript(Object.seal)

Javascript(Object.seal)&使用小细节

这几天遇到一个坑,讲的是js保护对象的其中一种方法。封闭(Sealing)
Object.seal(obj)

Object.seal()
方法可以让一个对象密封,并返回被密封后的对象。密封对象是指那些不能添加新的属性,不能删除已有属性,以及不能修改已有属性的可枚举性、可配置性、可写性,但可能可以修改已有属性的值的对象。

Javascript(Object.seal)

调用了seal这个函数,会把属性的configurable设置为false,也就是不能修改他的属性特性。
不知道各位有没有发现其中有一个小小的问题。configurable明明设置为false,但是我还是可以修改它的可写性,writable从原来的true->false。
后来经过一番查书之后,才发现一个小小的细节。

configurable持有一个布尔值,如果它是false,那么你不能删除、改变属性的人和特性,除了value,也不能把它从数据属性转换为访问其属性,反之亦然,它控制着属性元数据的可写性。但是有个例外,js允许非配置属性从可写状态变成只读状态,因为数组的属性length总是可写的且不可配置。如果没有这个例外就不能冻结数组。

所以如果是一开始使用默认的可写性writable=true;他是可以被允许在configurable为false的时候改变成为false的。那这时候问题又来了, 如果我已经显性设置了可写性为true呢?

Javascript(Object.seal)

t.foo也是被改变成为false,所以说明不管显隐性声明可写行,在不可配置的情况下依然可以总是可以被从可读可写改为只读。