JS基础知识 - Object的方法

97 阅读1分钟

Object.freeze() 可以冻结一个对象,再也不能被修改

  • 不能添加新属性
  • 不能删除已有属性
  • 不能修改已有属性的可枚举性、可配置性、可写性
  • 不能修改已有属性的值
  • 不能修改原型

对比const,声明简单类型的值不能修改,但是对象可以修改的。所以,想禁止一个对象的修改就可以用Object.freeze()

const obj = {
  count: 1
}
obj.count = 2;
console.log(obj.count); // 2

const objFreeze = Object.freeze({
  count: 1
})
objFreeze.count = 2; // 报错Cannot assign to read only property 'count' of object

浅冻结

const obj = {
  students: {}
}

Object.freeze(obj);
obj.students.num = 1
console.log(obj.students.num); // 1

深冻结 - 使对象不可变,需要递归冻结每个类型为对象的属性

function deepFreeze(obj) {
  // 获取定义在obj上的属性名
  var propNames = Object.getOwnPropertyNames(obj);
  // 在冻结自身之前冻结属性
  propNames.forEach(function(name) {
    var prop = obj[name];

    // 如果prop是个对象,冻结它
    if (typeof prop == 'object' && prop !== null)
      deepFreeze(prop);
  });
  return Object.freeze(obj);
}