今天看到了一个题目 :禁止修改一个对象属性值,有那些操作?
ES5
ES5
定义了 defineProperty
来定义与属性有关的操作,不仅可以设置初对象的初始值,而且可以对对象的属性进行控制,比如 是否可枚举,是否可遍历,是否可配置,是否可写等等
const a = {};
Object.defineProperty(a,'name',{
value:'qujun',
writable:true,
emurable:true,
configurable:true
})
类似我们就定义了一个最简单的配置,回归题目,如果让value 变得不能修改,那么 只需要设置wirtable:false
即可。那么如果无论修改了什么值 a.name
的值永远是 qujun
同样 configurable
也具有相同的功能,如果设置 configurable
为 true,则 name
属性不能被删除,也不能被重写其他的属性,否则会报错。
对象里目前存在的属性描述符有两种主要形式:数据描述符和存取描述符, 上面描述的是数据描述符 还有一种是 存取描述符 就是 getter 和 setter
const a = {};
const temp = '12'
Object.defineProperty(a,'name',{
get(){
return temp
}
})
get
是 获取一个属性值,所以上面的 a.name
永远就是返回 temp 的值 12
ES5 还提供了一种方法 Object.freeze(obj)
freeze 方法是冻结一个对象,与 上面的 configurable 类似,configurable 是对象下的某一个属性的相关配置被冻结 但是 freeze 是有关该对象下的所有操作被冻结,包括新增,删除属性,相关对象下属性的配置通通无效。
ES6
es6 提供了很强大的东西proxy
该属性可以对一个对象的类似底层语法进行拦截。用于定义基本操作的自定义行为(如属性查找,赋值,枚举,函数调用等)。同样提供了 getter 和 setter
var handler = {
get: function(target, name){
if(name === 'name'){
return 'qujun'
}
}
};
var person = new Proxy({}, handler);
上面的demo target 是 当前对象,name 是属性名 如果一个name 的 属性名是 name,那么该属性永远返回 'qujun',重新赋值也不起作用。
》找到自驱力