Object属性控制

2019-03-13  本文已影响0人  Jerry_qu

今天看到了一个题目 :禁止修改一个对象属性值,有那些操作?

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',重新赋值也不起作用。

》找到自驱力

上一篇 下一篇

猜你喜欢

热点阅读