Object.freeze()

217 阅读1分钟

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