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

news/2024/7/8 0:12:21

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


http://lihuaxi.xjx100.cn/news/7607.html

相关文章

Liunx 部署后端服务jar包脚本

1.停止指定端口进程,部署服务 #!/bin/bash # jar包名称 app_namedigital-service-1.0-SNAPSHOT.jar # 服务器jar包路径 app_path/home/jar/ # 指定端口 app_port9199 # 杀掉指定端口的应用进程 pidnetstat -apn|grep $app_port|awk {print $7}|cut -d/ -f1 echo &qu…

软件测试的学习笔记(1)

一、认识 1.什么是软件测试? 软件测试就是软件测试人员验证软件是否满足用户的需求。 2.软件测试和软件开发的区别? (1)本身 开发:广度小,专业度高 测试:所需要技能比较…

MySQL数据库之用户管理

一、mysql中常见的的约束/规则 ① 主键约束(primary key) ② 外键约束(foreign key): 如果同一个属性字段在表一中为主键,而在表二中不是主键,则字段称为表二的外键。 ③ 非空约束(…

凌恩项目文章|ISMEC:根际菌群移植筑起番茄根际免疫新防线

植物根际定殖着大量有益微生物,在植物抗病能力形成过程中发挥着关键作用,能否把抗病植物根际微生物组移植给感病品种,提升其根际免疫能力已成为热点问题。凌恩客户南京农业大学沈其荣院士团队和广西农科院蔬菜研究所王益奎副所长团队合作在IS…

多商户商城系统功能拆解43讲-平台端应用-客服话术

多商户商城系统,也称为B2B2C(BBC)平台电商模式多商家商城系统。可以快速帮助企业搭建类似拼多多/京东/天猫/淘宝的综合商城。 多商户商城系统支持商家入驻加盟,同时满足平台自营、旗舰店等多种经营方式。平台可以通过收取商家入驻…

Java:BIO、NIO、AIO

很多文章在谈论到BIO、NIO、AIO的时候仅仅是抛出一堆定义,以及一些生动的例子。看似很好理解。但是并没有将最基础的本质原理显现出来,如果没有没有从IO的原理出发的话是很难理解这三者之间的区别的。所以本篇文章从Java是如何进行IO操作为开头进行分析。…

A8.2022年全国数学建模竞赛 B题-赛题分析与讨论

2022年全国数学建模竞赛 B题-赛题分析与讨论 说明:本文目前内容为 2021年国赛 B题,将于 2022/9/15 22:00 第一次更新, 2022/9/16 12:00 第二次更新,建议收藏.** 1. 2021年B 题(C4 烯烃广泛应用于化工产品及医药的生产&…

Pytorch优化器全总结(二)Adadelta、RMSprop、Adam、Adamax、AdamW、NAdam、SparseAdam

目录 写在前面 一、torch.optim.Adadelta Adadelta代码 Adadelta算法解析 Adadelta总结 二、torch.optim.RMSprop RMSprop代码 RMSprop算法解析 RMSprop总结 三、torch.optim.Adam(AMSGrad) Adam代码 Adam算法解析 Adam总结 四、torch.optim.Adamax Adamax代码 …