对象的禁止拓展、密封和冻结

禁止拓展

Object.preventExtensions 方法让一个对象变的不可扩展,也就是不能再添加新的属性,但可以修改现有属性的值

var obj = {}

Object.isExtensible(obj) //=== true
obj.a = 5
console.log(obj.a) // 5

Object.preventExtensions(obj)
Object.isExtensible(obj) //=== false
obj.a = 6
console.log(obj.a) // 6
obj.b = 5
console.log(obj.b) // undefined

Object.preventExtensions 会返回原对象

var obj = {}
var obj2 = Object.preventExtensions(obj)
obj === obj2  // true

密封

Object.seal 会创建一个“密封”的对象,这个方法实际上会在一个现有对象上调用 Object.preventExtensions 并把所有现有属性标记为 configurable:false

所以,密封之后不仅不能添加新属性,也不能重新配置或者删除任何现有属性,但依然可以修改现有属性的值

var obj = { a: 5 }

Object.isSealed(obj) // === false
obj.a = 6
console.log(obj.a) // 6
obj.b = 7
console.log(obj.b) // 7
delete obj.a
console.log(obj.a) // undefined

Object.seal(obj)
Object.isSealed(obj) // === true
obj.b = 8
console.log(obj.b) // 8
obj.c = 9
console.log(obj.c) // undefined
delete obj.b
console.log(obj.b) // 8

Object.seal 亦会返回原对象

var obj = {}
var obj2 = Object.seal(obj)
obj === obj2  // true

冻结

Object.freeze 会创建一个冻结对象,这个方法实际上会在一个现有对象上调用 Object.seal 并把所有“数据访问”属性标记为 writable:false,这样就无法修改它们的值

被冻结的对象不能添加新的属性,不能删除已有属性,不能修改已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值,但对象引用的其他对象不受影响,属于浅冻结

var obj = { a: 5 }

Object.isFrozen(obj) // === false
obj.a = 6
console.log(obj.a) // 6
obj.b = 7
console.log(obj.b) // 7
delete obj.a
console.log(obj.a) // undefined

Object.freeze(obj)
Object.isFrozen(obj) // === true
obj.b = 8
console.log(obj.b) // 7
obj.c = 9
console.log(obj.c) // undefined
delete obj.b
console.log(obj.b) // 8

Object.freeze 亦会返回原对象

var obj = {}
var obj2 = Object.freeze(obj)
obj === obj2  // true
除特殊说明外本人博客均属原创,转载请注明出处:http://blog.johnhan.cn/blog_1075.html
京ICP备19044523号-1