做了这么久大前端,突然想自定义一个只读变量(对象)用来做初始值,竟然想不起怎么做,因为不想被vue的双向绑定在赋值的时候被同步修改了;因此为了保证定义的这个变量是不能被修改的,小编找了比较多的资料,总结如下:
1、 Object.freeze(obj);
描述:被冻结对象自身的所有属性都不可能以任何方式被修改。任何修改尝试都会失败,无论是静默地还是通过抛出TypeError异常(最常见但不仅限于strict mode)。
这个是小编找到的最简单直接的了,看描述就知道一旦定义了就只能原封不动,不能修改删除;
//控制台操作
let b = Object.freeze({a:1});
console.log(b) //{a: 1}
b.a = 2
console.log(b.a)//1
2、Object.defineProperties(obj, props)与Object.defineProperty(obj, prop, descriptor)
描述:方法直接在一个对象上定义新的属性或修改现有属性,并返回该对象。
Object.defineProperties可以定义多个只读属性,Object.defineProperty只能定义一个;
//定义c对象的多个属性(可设置读写权限),注意写法
let c = Object.defineProperties({}, {
'a': {
value: "可修改",
writable: true
},
'b': {
value: '只读',
writable: false
}
});
c.a = 2
console.log(c.a)//2
c.b = 2
console.log(c.b)//'只读'
//定义c对象的一个a只读属性
let c = Object.defineProperty({},"a", {
value: 1
writable: false
});
c.a = 2
console.log(c.a)//1
3、闭包
描述:最不想说的一个,因为闭包是最难理解的,写法也很繁杂;
let c = (function(){
let a = 1
return function(){
return a
}
})()
console.log(c())//1