概述
有时候我们写了一个js库,里面有一些核心对象,我们希望在开发过程中这个核心对象不被修改,这时候就要防止该对象被篡改,以达到保护对象属性的目的,可通过以下三个方法去实现
一、扩展
语法:Object.preventExtensions(obj) // 扩展
说明:方法来阻止对象扩展,不可扩展对象不能继续添加新属性与新方法,但可修改原属性与原方法
let obj = { name: 'wxy' }
Object.preventExtensions(obj) // 设置obj为不可扩展对象
obj.age = 20 // 给obj对象添加新属性
console.log(obj) // { name: 'wxy' } 新属性未添加成功
语法:Object.isExtensible(ojb) // 是否可以扩展 (默认为true)
说明:该方法判断一个对象属性是否可以扩展
let obj = { name: 'wxy' }
Object.isExtensible(obj) // true
Object.preventExtensions(obj) // 设置为不可扩展
console.log(Object.isExtensible(obj)) // false
二、密封
语法:Object.seal(obj) // 设置为密封对象
说明:密封后的对象是不可添加新属性,不可删除原有属性,也不可对属性进行再次配置,但是却是可以对原属性的值进行修改的
let obj = { name: 'wxy' }
Object.seal(obj) // 设置obj对象为密封对象
delete obj.name // false 不可删除
obj.age = 20 // 不可添加
console.log(obj) // { name: 'wxy' }
obj.name = 'hello' // 可修改
console.log(obj) // { name: 'hello' }
语法:Object.isSealed(ojb) // 判断对象是否为密封
说明:该方法判断一个对象是否是密封对象
let obj = { name: 'wxy' }
Object.isSealed(obj) // false 判断是否是密封对象
Object.seal(obj) // 设置obj为密封对象
Object.isSealed(obj) // true 判断是否是密封对象
三、冻结
语法:Object.freeze(obj) // 设置对象为“冻结”
说明:冻结对象是指这个对象,不可添加属性,不可删除属性,不可修改属性,也不可对属性进行配置。也就是说此对象为一个不可变的对象。
let obj = { name: 'wxy' }
Object.freeze(obj) // 设置obj对象为冻结对象
delete obj.name // false 不可删除属性
obj.age = 20 // 不可添加属性
obj.name = 'hello' // 不可修改属性
console.log(obj) // { name: 'wxy' }
语法:Object.isFrozen(obj) // 是否为 "冻结"
说明:该方法判断一个对象是否是冻结对象
let obj = { name: 'wxy' }
Object.isFrozen(obj) // false 判断是否是冻结对象
Object.freeze(obj) // 设置obj为冻结对象
Object.isFrozen(obj) // true 判断是否是冻结对象
浅冻结和深冻结
浅冻结:如果对象的属性是一个对象,对这个外部对象进行冻结,内部对象的属性是依旧可以改变
let obj = {
name: 'wxy',
hobbies: { one: 'soccer' }
}
freeze(obj) // 设置对象为"冻结"
obj.hobbies.one = 'music' // obj内部对象属性仍然可以修改
深冻结:如果外部对象冻结的同时把其所有内部对象甚至内部的内部无限延伸的对象属性也冻结了
let obj = {
name: 'wxy',
hobbies: { one: 'hiking', two: 'soccer' }
}
// 深冻结函数
function deepFreeze(o){
var prop,propKey
Object.freeze(o) // 首先冻结第一层对象
for(propKey in o){
prop = o[propKey]
if(!o.hasOwnProperty(propKey) || !(typeof prop === "object") || Object.isFrozen(prop)){
continue;
}
deepFreeze(prop) //递归
}
}
deepFreeze(obj) // 调用深冻结函数
obj.hobbies.one = 'music' // obj内部对象属性也不可修改了
* 具体差异如下图所示
方法 | 禁止添加属性 | 禁止删除属性 | 禁止修改属性 |
---|---|---|---|
Object.preventExtensions() | 是 | 否 | 否 |
Object.seal() | 是 | 是 | 否 |
Object.freeze() | 是 | 是 | 是 |
最后
以上就是懵懂哈密瓜为你收集整理的JS 对象之扩展、密封和冻结一、扩展二、密封 三、冻结的全部内容,希望文章能够帮你解决JS 对象之扩展、密封和冻结一、扩展二、密封 三、冻结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复