主要用到Object.freeze方法,它主要是让对象的属性不能被修改,即使修改了也无效,严格模式下会报错,但是它只能冻结第一层,所有要冻结深层的需要递归
直接上代码
'use strict'
const createConstObj = (obj) => {
let propsNames = Object.getOwnPropertyNames(obj)
propsNames.forEach(name => {
let prop = obj[name]
if (typeof prop === 'object' && prop !== null) {
obj[name] = createConstObj(prop)
}
})
return Object.freeze(obj)
}
// 调用
const obj1 = createConstObj({
a: 1,
b: {
a: 1,
b: 2
}
})
obj1.b.c // 报错
delete obj1.b.a // 报错
console.log(obj1);
因为上面使用了严格模式,所有会直接报错,如果不用严格模式可以修改,但是不会生效,也不会报错
那如果不用严格模式又想报错怎么办呢?可以用数据劫持或者proxy代理来做
直接上代码
const createConstObj = (obj) => {
let propsNames = Object.getOwnPropertyNames(obj)
propsNames.forEach(name => {
let prop = obj[name]
if (typeof prop === 'object' && prop !== null) {
obj[name] = createConstObj(prop)
}
})
// return Object.freeze(obj)
return new Proxy(obj, {
deleteProperty(target, key) {
throw new Error('不能删除' + key)
},
get(target, key) {
if (!target.hasOwnProperty(key)) {
throw new Error(key + '不存在')
} else {
return target[key]
}
},
set(target, key, value) {
throw new Error('不能修改' + key)
}
})
}
// 调用
const obj1 = createConstObj({
a: 1,
b: {
a: 1,
b: 2
}
})
obj1.b.c // 报错
delete obj1.b.a // 报错
console.log(obj1);
这样的话其实Object.freeze用不用都可以了