必要性:  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中保护对象的措施总结的更多相关文章

  1. 【学习笔记】六:面向对象的程序设计——理解JS中的对象属性、创建对象、JS中的继承

    ES中没有类的概念,这也使其对象和其他语言中的对象有所不同,ES中定义对象为:“无序属性的集合,其属性包含基本值.对象或者函数”.现在常用的创建单个对象的方法为对象字面量形式.在常见多个对象时,使用工 ...

  2. OpenGL ES 中Uniform块

    1.采用uniform Block的原因如果你的程序中包含了多个着色器,而且这些着色器使用了相同的Uniform变量,你就不得不为每个着色器分别管理这些变量.Uniform变量的location是在程 ...

  3. ES 中的那些坑

    数组 1. 数组中的 full-text 字段将被 [analyzed] 2. 数组中[所有元素]的数据类型必须一致 3. 数组的数据类型,以其 [第一个元素]为准 映射 1. 数据类型会自动进行转化 ...

  4. 通过cocos2d-x的CCGLProgram和CCShaderCache的实现来分析OpenGL ES中的Shader编程

    在OpenGL ES中,Shader是着色器,包括两种:顶点着色器(Vertex Shader)和片元着色器(Fragment Shader).每个program对象有且仅有一个Vertex Shad ...

  5. 【Hook技术】实现从"任务管理器"中保护进程不被关闭 + 附带源码 + 进程保护知识扩展

    [Hook技术]实现从"任务管理器"中保护进程不被关闭 + 附带源码 + 进程保护知识扩展 公司有个监控程序涉及到进程的保护问题,需要避免用户通过任务管理器结束掉监控进程,这里使用 ...

  6. PHP中的对象遍历技巧

    PHP中的对象遍历 对象的遍历,主要是指遍历对象中的,对外部可见属性.实际上就是用访问限制符public声明的属性,这点大家肯定很熟悉了.并且,在php中,遍历对象居然与遍历数组一样,都可以用使用fo ...

  7. ES中const

      前  言 EScript 上一次总结了,ES中let和var的区别,今天在带大家了解另一个声明关键词:const. const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改 ...

  8. SpringData ES中一些底层原理的分析

    之前写过一篇SpringData ES 关于字段名和索引中的列名字不一致导致的查询问题,顺便深入学习下Spring Data Elasticsearch. Spring Data Elasticsea ...

  9. ES 06 - 通过Kibana插件增删改查ES中的索引文档

    目录 1 document的结构 2 document的常见CRUD操作 2.1 添加商品: 添加文档并建立索引 2.2 查询商品: 检索文档 2.3 修改商品: 替换文档 2.4 修改商品: 更新文 ...

随机推荐

  1. 关于线程安全Dictionary

      使用Dictionary时, 是线程不安全的(). 会出现以下的问题, 导致IIS挂掉: 其实DicMapper是不为NUL的, DicMapper["aaasdfasdfasdfzxc ...

  2. struts2基础——需要注意的几点

    struts是流行和成熟的基于MVC设计模式的web应用程序框架,使用struts可以帮助我们减少运用MVC设计模型来开发web应用的时间. 目录: 一.struts2的工作原理及文件结构 二.三种访 ...

  3. Educational Codeforces Round 11C. Hard Process two pointer

    地址:http://codeforces.com/contest/660/problem/C 题目: You are given an array a with n elements. Each el ...

  4. CSS流体(自适应)布局下宽度分离原则

    CSS流体(自适应)布局下宽度分离原则 这篇文章发布于 2011年02月28日,星期一,00:48,归类于 css相关. 阅读 73990 次, 今日 5 次 by zhangxinxu from h ...

  5. Python面试题之集合推导式、字典推导式

    集合推导式 集合推导式(set comprehensions)跟列表推导式也是类似的, 唯一的区别在于它们使用大括号{}表示. Code: sets = {x for x in range(10)} ...

  6. CMD 配置静态IP与DNS

    配置静态IP与DNS # 修改IP netsh interface ip set address "网络连接" static IP地址 子网掩码 默认网关 # 修改DNS nets ...

  7. Tomcat 优化相关知识

    ---------(Tomcat Listener)----------- Tomcat 性能的因素是内存泄露.Server标签中可以配置多个Listener,其中 JreMemoryLeakPrev ...

  8. CSV文件导入导出MySQL

    使用SQLyog 工具导入文件数据到MySQL: Excel文件导入导出: 需要驱动:Microsoft Office 2007驱动 导入需要注意的问题:1.Excel里数值列,默认导入会变成浮点型. ...

  9. @WebListener 注解方式实现监听

    1.创建 Dynamic Web Project ,Dynamic Web module version选择3.0 2.在自动生成 的web.xml配置,增加 metadata-complete=&q ...

  10. Ajax -- 原理及简单示例

    1. 什么是Ajax •Ajax被认为是(AsynchronousJavaScript and XML的缩写).现在,允许浏览器与服务器通信而无须刷新当前页面的技术都被叫做Ajax. 2. Ajax ...