Object.freeze()
在严格模式下确实抛出。
在严格模式下,以下程序将在冻结对象上添加、更改或删除任何属性时抛出。
假设我们有
'use strict'
const obj = Object.freeze({ test: true })
添加属性时出错:
obj.other = true
// TypeError: Can't add property another, object is not extensible
改变现有属性会引发:
obj.test = false
// TypeError: Cannot assign to read only property 'test' of object '#<Object>'
删除属性会引发:
delete obj.test
TypeError: Cannot delete property 'test' of #<Object>
如果想更详细地了解严格模式(强烈推荐),请查看官方 MDN 文档以了解差异。
关于这个话题的观点各不相同——人们会期望对象的突变会抛出,因为“你正在做你不应该做的事情”,而其他人可能会说如果你Object.freeze()
做某事,你只是想防止对其进行任何修改。并且你成功地完成了。如果它导致应用程序因突变而崩溃,程序员将别无选择,只能检查他们没有创建的所有对象try/catch
的冻结性,或者他们必须将所有此类操作包装在块中。这简直是太过分了。
注意事项try/catch
try/catch
您可以通过检查对象的温度来避免将属性操作包装在块中:
if (Object.isFrozen(obj) {
// Can't touch this!
}