Es5----严格模式和保护对象

一、
严格模式:
比普通的js运行机制要求更严格的新运行机制
在当前作用域的顶部 “use strict”
新要求:
1.禁止给未声明过得变量赋值
旧的js中:可以给未声明过得变量赋值,结果会自动在全局创建该变量,不会报错。
缺点:极易造成全局变量,不便于调试程序
新的js中严格模式,禁止给未声明过得变量赋值,如果强行赋值会报错。
2.静默失败升级为错误
3.普通函数调用中的this不再指window,而指undefined
旧的js中:如果函数调用时前边既没有点,又没有new,函数中的this默认指window
堵住了因为this导致的全局污染
4.禁用了arguments.callee
arguments.callee,在调用函数时,函数内部自动获得当前函数本身的关键词
只要使用递归,在函数内都要用arguments.callee代替写死的函数名
禁用:递归算法本身效率有问题,存在着大量重复计算,效率极低。

二、
保护对象
保护属性:js中的对象毫无自保能力,外界可以随意修改属性值,随意添加删除属性。
1.其实每个属性底层,又是一个缩微的小对象
eid:{
value:101 替当前属性实际存储属性值
writable:true 控制是否可修改当前属性值
enumerable:true 控制是否可用for in 遍历到这个属性值
configurable:true 控制是否可删除当前属性,控制是否可修改前两个开关
}
2.获得 var 变量名=Object.getOwnPropertyDescriptor(对象名,“属性名”)
3.如何修改一个属性中的开关:
Object.defineProperty(对象名,“属性名”,{writable:false})
4.修改多个:
Object.defineProperties(对象名,{ 属性名:{开关:true/false} } )

访问器属性:
	自己不保存属性值,而是仅提供对另一个数据属性的保护
	定义访问器属性:将要保护的属性 隐姓埋名
								将原属性名改为访问器属性
	var eric={
		ename:'埃里克',
		eage:25 //要保护的真正的属性
	}
	Object.defineProperties(eric,{
		//先创建一个_eage属性,将eage属性中的值转移到_eage中,这才是真正保存的属性值
		_eage:{
			value:eric.eage,
			writable:true,
			enumerable:false,
			configurable:false
		},
		//将原属性名更换为一个访问器属性,负责从隐藏的_eage中读取属性值给外部
		eage:{
			get:function(){
				return this._eage;
			},
			//负责接收要赋值的新值,先验证,验证通过后,才将新值保存到隐藏的_eage属性中
			set:function(value){
			//value运行时,会自动接住要修改的新值
				if(value>=18&&value<=65){
					console.log('已成年');
					//条件符合,才将新值保存到隐藏的数据属性中
					this._eage=value;
				}else{...	}
			}
			//保镖要隐藏的数据属性抛头露面
			//保镖不能轻易被删除
			enumerable:true,
			configurable:false
		}
	})
	访问器属性中的get()和set()函数内的this-->当前访问器所在的对象
	虽然编码时,get()和set()写在eage()内,但编译运行时,js会将eage访问器属性打散
	get()和set()不再属于eage:{},而是属于eage所在的对象eric

保护结构:
保护属性:只能挨个保护单个属性的值,无法阻止用户对象添加新属性或删除现有属性
Es5中提供了专门保护对象结构的方法:
1.防扩展:
禁止对这个对象强行添加新属性
Object.preventExtensions(对象名)
只防止添加新属性,不防止删除现有属性
2.密封:
禁止添加新属性,又禁止删除现有属性
强调:
密封已经包含了preventExtensions,所以只要用密封,就不用preventExtensions
不再重复在每个属性上设置configurable:false
Object.seal(对象名)
3.冻结:
不但禁止添加删除属性,甚至禁止修改任何属性
Object.freeze(对象名)
原理:
1.自动调用了preventExtensions()
2.自动修改了每个属性的configurable为false
3.自动修改每个属性的writable为false

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值