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
将被定义或修改的属性描述符。

最新文章

  1. C# 生成xml文件
  2. odoo注销后在登录时的用户名和密码
  3. linux运维的认知及RHEL7 Unix/Linux 系统 介绍和安装
  4. DotNet中人民币符号的输出
  5. 关于android中线性布局的layout_gravity属性
  6. iOS 学习 - 1.代理传值
  7. Linux kernel中网络设备的管理
  8. iOS-Wonderful 完美颜色库
  9. c# 上传图片到一个外链相册服务器
  10. jmeter 压测常见的几种报错
  11. Spark学习之常用算子介绍
  12. [转]angular2封装material2对话框组件
  13. header 和http状态码
  14. sqljdbc4.jar的安装
  15. 【NIFI】 实现数据库到数据库之间数据同步
  16. 我用ASP.NET缓存之OutputCache
  17. Json格式String类型字符串转为Map工具类
  18. ecshop hash登录 + wordpress mysql盲注字段
  19. 常用WebSite Address
  20. 20145331 《Java程序设计》第3周学习总结

热门文章

  1. MySQL检查与性能优化示例脚本
  2. 【LeetCode】面试题62. 圆圈中最后剩下的数字
  3. thinkphp 初始化
  4. 缩减Azure上Linux虚拟机系统盘容量
  5. Ubuntu开启SSH端口并且搭建Vulhub环境
  6. BUU八月份水题记录
  7. 刷了无数大厂Android研发岗面试题,其实考的无非是这 3 点能力
  8. js继承方式及特征
  9. alpakka-kafka(8)-kafka数据消费模式实现
  10. C语言中的stdin,stdout,stderr[转]