Object.freeze() 方法可以冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。此外,冻结一个对象后该对象的原型也不能被修改。freeze() 返回和传入的参数相同的对象。
const object = {
name:"张三",
age:20
}
Object.freeze(object);
object.name = "李四";
console.log(object.name); //张三
语法
Object.freeze(obj)
参数
obj - 被冻结的对象
返回值
返回被冻结的对象
const object = {
name:"张三",
age:20
}
Object.freeze(object);
object.name = "李四";
console.log(object.name); //张三
//添加新的属性-无效
object.sex = "男";
console.log(object.sex); //undefined
//移除属性-无效
delete object.age;
console.log(object.age); //20
//修改name属性的描述-无效
Object.defineProperty(object,"name",{
enmuerable:false, //修改为不可枚举
});
for(var key in object){
console.log(key);
}
// name age
//修改原型-无效
Object.setPrototypeOf(object, { x: 20 })
obj.__proto__ = { x: 20 }
冻结对象的属性如果基本类型(字符串、数字、boolean)是不可变的,俗称 浅冻结 但是如果是引用类型(函数、对象、数组等)则是可变的。
const object = {
user:{
name:"张三"
}
}
Object.freeze(object);
object.user.name = "李四"
console.log(object.user.name); // 李四
深冻结
function deepFreeze(obj) {
var props = Object.getOwnPropertyNames(obj);
console.log("props", props);
props.forEach((key) => {
if (typeof obj[key] === "object" && obj[key] !== null) {
deepFreeze(obj[key]);
}
});
return Object.freeze(obj);
}
const user = {
name: "张三",
info: {
age: 12
}
};
deepFreeze(user);
user.name = "李四";
console.log(user.name); //张三
user.info.age = 16;
console.log(user.info.age); //12