自己封装一个Object.freeze()方法
2024-10-19 21:24:31
1、遍历所有属性和方法
2、修改遍历到的属性的描述
3、Object.seal()
Object.defineProperty(Object,'freezePolyfill',{
value:function(obj){
var i;
//遍历属性和方法
for(i in obj){
if(obj.hasOwnProperty(i)){
Object.defineProperty(obj,i,{
//修改遍历到的属性
writable:false
});
}
}
Object.seal(obj);
}
});
如果对象的其中一个属性又是对象,那么这个对象中的对象里的属性是可以被修改的。可以使用递归判断外层对象的属性是否为对象,再重新使用freezePolyfill()方法去套。(不使用递归而使用迭代的方式也可以):
Object.defineProperty(Object,'freezePolyfill',{
value:function(obj){
var i;
for(i in obj){
if(obj.hasOwnProperty(i)){
//判断属性是否为对象
if(typeof(obj[i]) === 'object'){
//迭代freezePolyfill方法
Object.freezePolyfill(obj[i]);
}else{
Object.defineProperty(obj,i,{
writable:false
});
}
}
}
Object.seal(obj);
}
});
应用:
const xiaoming = {
age:14,
name:'小明',
obj:{
a:1
}
};
Object.freezePolyfill(xiaoming);
总结:
Object.defineProperty(obj,name,value)这个方法可以往一个对象上添加一个属性。第一个参数为对象名,第二个参数为属性名,第三个参数为属性值及描述。
Object.seal(变量名)方法可以阻止对象被扩展,但是无法阻止对象被修改。可以使用defineProperty()将对象属性设置为只读。
上述两个方法结合起来可以简单的达到一个Ojbect.freeze()的效果。
语法
Object.defineProperty(obj, prop, descriptor)
参数
obj
- 要在其上定义属性的对象。
prop
- 要定义或修改的属性的名称。
descriptor
- 将被定义或修改的属性描述符。
最新文章
- C# 生成xml文件
- odoo注销后在登录时的用户名和密码
- linux运维的认知及RHEL7 Unix/Linux 系统 介绍和安装
- DotNet中人民币符号的输出
- 关于android中线性布局的layout_gravity属性
- iOS 学习 - 1.代理传值
- Linux kernel中网络设备的管理
- iOS-Wonderful 完美颜色库
- c# 上传图片到一个外链相册服务器
- jmeter 压测常见的几种报错
- Spark学习之常用算子介绍
- [转]angular2封装material2对话框组件
- header 和http状态码
- sqljdbc4.jar的安装
- 【NIFI】 实现数据库到数据库之间数据同步
- 我用ASP.NET缓存之OutputCache
- Json格式String类型字符串转为Map工具类
- ecshop hash登录 + wordpress mysql盲注字段
- 常用WebSite Address
- 20145331 《Java程序设计》第3周学习总结