ES中保护对象的措施总结
必要性: JS中的对象可随意修改属性值,可随意添加删除属性,太乱,数据安全得不到保障。
如何保护:
保护属性: 保护对属性值的修改
对象属性分为:
命名属性: 可直接用.访问到的属性
数据属性: 直接存储属性值的属性
如何保护: 四大特性:
value: 实际存储属性值
writable: 控制属性是否可修改
enumerable: 控制属性是否可被遍历
仅控制遍历,无法控制用.访问
configurable: 控制是否可删除属性
控制是否可修改其他两个特性
强调: configurable经常作为前两个属性的双保险,且一旦设为false,不可逆!
如果查看四大特性:
Object.getOwnPropertyDescriptor(obj,"属性名")
如何修改四大特性:
Object.defineProperty(obj,"属性名",{
特性:值,
特性:值,
... ...
})
问题: defineProperty一次只能修改一个属性
解决: 同时修改多个属性:
Object.defineProperties(obj,{
属性名:{ 要修改的特性 },
属性名:{ 要修改的特性 },
... : ...
})
问题: 无法使用自定义逻辑保护属性
解决:
访问器属性: 不直接存储属性值
仅提供对其他数据属性的保护
何时: 只要用自定义逻辑保护属性时
如何: 2步:
1. 定义一个隐藏的数据属性实际存储属性值
2. 添加访问器属性保护隐藏的数据属性:
Object.defineProperty(obj,"属性名",{
get(){//在试图获取属性值时自动调用
//返回受保护的数据属性值
},
set(val){//在试图修改属性值时自动调用
//参数val会自动获得要修改的新值
//如果验证val符合规则
//才将val赋值给受保护的属性
//否则
//报错!
},
enumerable:true,
configurable:false
})
如何使用访问器属性: 同普通属性用法完全一致
其中赋值时,自动调用set,取值时自动调get
内部属性: 不能用.直接访问的隐藏属性
__proto__
防篡改: 保护对对象结构的修改
3个级别:
1. 防扩展: 禁止添加新属性
Object.preventExtensions(obj)
原理: 每个obj内部都有一个隐藏属性:
Extensible,默认为true
preventExtensions将obj的Extensible改为false
2. 密封: 在防扩展基础上,进一步禁止删除现有属性
Object.seal(obj)
原理: 修改obj的Extensible为false
将所有属性的configurable都改为false
3. 冻结: 在密封基础上禁止修改任何值
Object.freeze(obj)
原理: 修改obj的Extensible为false
将所有属性的configurable都改为false
还将所有属性的writable都改为false
Object.create(): 可直接用一个父对象创建一个子对象。
如何: var child=Object.create(father,{
自有属性:{
value:值,
writable:true,
enumerable:true,
configurable:true,
},
... : {
...
}
});
强调: 只要添加到对象中的属性,四大特性默认为false,必须显式写为true。
例子:
 "use strict";
  var emp={
    id:1001,     //禁止修改
    ename:"eric",//禁止删除
    salary:12000 //禁止遍历
  }
  //禁止修改id的值
  //禁止删除ename:
  //禁止遍历salary:
  Object.defineProperties(emp,{
    id:{
      writable:false,
      configurable:false
    },
    ename:{configurable:false},
    salary:{
      enumerable:false,
      configurable:false
    }
  });
//  Object.defineProperty(emp,"id",{
//    writable:false,
//    configurable:false//不可逆
//  });
//  Object.defineProperty(emp,"ename",{
//    configurable:false//不可逆
//  });
//  Object.defineProperty(emp,"salary",{
//    enumerable:false,
//    configurable:false//不可逆
//  });
//  Object.defineProperty(emp,"id",{
//    writable:true,
//    configurable:true
//  });
//  emp.id=1002;
//  delete emp.ename;
  console.dir(emp);
  for(var key in emp){
    console.log(key+":"+emp[key]);
  }
  console.log(emp.salary);
  console.log(
    Object.getOwnPropertyDescriptor(
      emp,"id"//ename//salary
    )
  );
"use strict";
var config={
IP:"192.168.0.100",
PORT:27017,
USER:"admin",
PWD:"123456"
}
Object.freeze(config);
//config.PORT=8080;
delete config.PORT;
var emp={id:1001,ename:"eric",_age:23};
  Object.defineProperty(emp,"_age",{
    enumerable:false,
    configurable:false
  });
  //要求:age必须介于18~65之间
  Object.defineProperty(emp,"age",{
    get(){
      console.log("自动调用get");
      return this._age
    },
    set(val){
      console.log("自动调用set");
      if(val>=18&&val<=65)
        this._age=val;
      else
        throw new RangeError("年龄必须介于18~65之间")
    },
    enumerable:true,
    configurable:false
  });
  //访问器属性的用法和普通属性完全一致
  emp.age++;
  console.dir(emp);
  emp.age=-2;
  var father={
    bal:10000000000,
    car:"infiniti"
  }
  var hmm=Object.create(father,{
    phone:{
      value:"IPhone 8 Plus",
      writable:true,
      enumerable:true,
      configurable:true
    },
    bao:{
      value:"LV",
      writable:true,
      enumerable:true,
      configurable:true
    }
  });
  console.dir(hmm);
ES中保护对象的措施总结的更多相关文章
- 【学习笔记】六:面向对象的程序设计——理解JS中的对象属性、创建对象、JS中的继承
		
ES中没有类的概念,这也使其对象和其他语言中的对象有所不同,ES中定义对象为:“无序属性的集合,其属性包含基本值.对象或者函数”.现在常用的创建单个对象的方法为对象字面量形式.在常见多个对象时,使用工 ...
 - OpenGL ES 中Uniform块
		
1.采用uniform Block的原因如果你的程序中包含了多个着色器,而且这些着色器使用了相同的Uniform变量,你就不得不为每个着色器分别管理这些变量.Uniform变量的location是在程 ...
 - ES 中的那些坑
		
数组 1. 数组中的 full-text 字段将被 [analyzed] 2. 数组中[所有元素]的数据类型必须一致 3. 数组的数据类型,以其 [第一个元素]为准 映射 1. 数据类型会自动进行转化 ...
 - 通过cocos2d-x的CCGLProgram和CCShaderCache的实现来分析OpenGL ES中的Shader编程
		
在OpenGL ES中,Shader是着色器,包括两种:顶点着色器(Vertex Shader)和片元着色器(Fragment Shader).每个program对象有且仅有一个Vertex Shad ...
 - 【Hook技术】实现从"任务管理器"中保护进程不被关闭 + 附带源码 + 进程保护知识扩展
		
[Hook技术]实现从"任务管理器"中保护进程不被关闭 + 附带源码 + 进程保护知识扩展 公司有个监控程序涉及到进程的保护问题,需要避免用户通过任务管理器结束掉监控进程,这里使用 ...
 - PHP中的对象遍历技巧
		
PHP中的对象遍历 对象的遍历,主要是指遍历对象中的,对外部可见属性.实际上就是用访问限制符public声明的属性,这点大家肯定很熟悉了.并且,在php中,遍历对象居然与遍历数组一样,都可以用使用fo ...
 - ES中const
		
前 言 EScript 上一次总结了,ES中let和var的区别,今天在带大家了解另一个声明关键词:const. const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改 ...
 - SpringData ES中一些底层原理的分析
		
之前写过一篇SpringData ES 关于字段名和索引中的列名字不一致导致的查询问题,顺便深入学习下Spring Data Elasticsearch. Spring Data Elasticsea ...
 - ES 06 - 通过Kibana插件增删改查ES中的索引文档
		
目录 1 document的结构 2 document的常见CRUD操作 2.1 添加商品: 添加文档并建立索引 2.2 查询商品: 检索文档 2.3 修改商品: 替换文档 2.4 修改商品: 更新文 ...
 
随机推荐
- 微信小程序将带来web程序员的春天!
			
微信之父张小龙在年初那次演讲中曾表示:“我自己是很多年的程序员,我觉得我们应该为开发的团体做一些事情.”几个月后,微信正式推出微信应用号(即微信小程序)在互联网中掀起又一波热潮. 过去,对于很多开发者 ...
 - Educational Codeforces Round 11B. Seating On Bus 模拟
			
地址:http://codeforces.com/contest/660/problem/B 题目: B. Seating On Bus time limit per test 1 second me ...
 - cdoj1338郭大侠与英雄学院
			
地址:http://acm.uestc.edu.cn/#/problem/show/1338 思路: 郭大侠与英雄学院 Time Limit: 6000/2000MS (Java/Others) ...
 - Entity FrameWork Code First 迁移命令详解
			
1. Enable-Migrations 启动迁移 执行get-help Enable-Migrations –detailed 查看Enable-Migrations的详细用法. -ContextT ...
 - 大牛是怎么思考设计MySQL优化方案的?
			
在进行MySQL的优化之前,必须要了解的就是MySQL的查询过程,很多查询优化工作实际上就是遵循一些原则,让MySQL的优化器能够按照预想的合理方式运行而已. 图-MySQL查询过程 一.优化的哲学 ...
 - jQuery双向滑动杆 设置数值百分比
			
在线演示 本地下载
 - Oracle中清除BIN$开头的垃圾表的解决办法 [转]
			
oracle drop table的时候,不会彻底删除该表,它将drop的表放到了自己的回收站里,放到回收站的表就是我们看到的形如bin$/rt62vkdt5wmrjfcz28eja==$0的表,其中 ...
 - 蓝屏代码大全 & 蓝屏全攻略
			
转载自http://diybbs.zol.com.cn/15/86_141447.html 一.蓝屏含义 1.故障检查信息 ***STOP 0x0000001E(0xC0000005,0xFDE38A ...
 - MyCat分片集群
			
数据库集群会产生的问题: 自增ID问题 数据关联查询问题(水平拆分) 数据同步问题 数据库集群 自动增长id产生重复的话,解决: UUID形式 (没有排序 不是自增) 设置数据库步长 其他方案: r ...
 - Luogu-3648 [APIO2014]序列分割
			
Luogu-3648 [APIO2014]序列分割 题目链接 题解: 首先要发现一个重要的性质:分割的顺序是不会影响答案的 证明: 首先对于没有交的两段区间,显然先后顺序改变不会有影响 而对于在同一段 ...