JS 对象之扩展、密封和冻结

有时候我们写了一个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()

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值