严格模式
什么是:比普通运行机制更严格的模式
为什么:js中存在很多广受诟病的缺陷
允许给未声明的变量赋值
静默失败(一句话没有执行成功但是也不报错)
何时:今后所有项目必须在严格模式下开
如何:在当前代码片段的顶部添加"use strict"
在两个范围启用严格模式:
1.在全局 新项目必须在全局启用严格
2.仅在函数内部 旧项目向严格模式迁移
要求:禁止给未声明的变量赋值。将所有静默失败升级为错误
保护属性
为什么:在传统的js中,对象的属性值和结构可以随意更改,毫无自保和验证能力
何时:今后所有的对象,都要被严格规定保护
ES5中的变化:
对象的属性也还是一个小的对象
对象的属性,包含四大特性
{
value:属性值
writable:true/false 控制是否可以修改属性
enumerable:true/false 控制是否可用for in遍历到该属性,仅控制for in遍历,用.依然可以访问到
configurable:true/false 控制禁止修改该属性 禁止修改其他特性的值 一旦改为false,不可逆,因此今后只要修改其他特性,都要伴随修改configurable为false,双保险
}
如何:
获取属性的四大特性
修改属性的四大特性
Object.defineProperty(obj,"属性名",{
writable: false,
enumerable:false,
configurable:false
})
问题:Object.defineProperty每次只能修改一个属性
解决:
Object.defineProperties(obj,{
属性名:{
特性名:值,
特性名:值,
...
},
属性名:{
特性名:值
}
})
问题:普通属性的四大特性,只能提供基本的保护,无法使用自定义规则保护属性
解决:用访问器属性
访问器属性:
ES5将对象的属性分为:数据属性和访问器属性
数据属性:直接存储属性值的属性
访问器属性:不直接存储数据,仅提供对其他数据属性的保护
为什么:数据属性只能对自己提供基本的保护,无法使用自定义的逻辑保护自己
何时:只要用自定义属性保护数据属性时,就只能用访问器属性
如何:2步
1.首先定义一个隐藏的实际存储数据的数据属性
2.然后定义访问器属性保护数据属性
使用访问器属性:用法和普通数据属性完全一样
防篡改:禁止修改对象的结构
三个级别:
1.防扩展:禁止对对象强行添加新属性
Object.preventExtensions(obj)
原理:对象都有一个内部属性:extensible,默认为true。preventExtensions其实是将extensible改为false
2.密封:在防扩展的同时,在禁止删除所有属性
Object.seal(obj);
原理:将所有属性的configurable特性都改为false
3.冻结:在密封的同时,在禁止修改所有的属性值
何时:如果一个对象连属性值都不让随便改,就要冻结
如何:Object.freeze(obj);
原理:将所有属性的writable特性改为false
Object.create:
三件事:基于现有的父对象,创建一个子对象,在扩展新属性
何时:只有一个父对象没有构造函数时,也想创建子对象
如何:
var child = Object.create(father,{
属性名:{
特性名:值
...:...
},
});