Làm sao để deep-freeze một đối tượng trong JavaScript?

{{FormatNumbertoThousand(model.total_like)}} lượt thích
388 lượt xem
Javascript master

Nếu bạn muốn đảm bảo đối tượng được deep-freeze (đóng băng sâu), bạn phải tạo một hàm đệ quy để freeze từng thuộc tính thuộc loại object:

without deep-freeze:

let person = {
   name: "Leonardo",
   profession: {
      name: "developer"
   }
};
Object.freeze(person); // make object immutable

person.profession.name = "doctor";
console.log(person); //output { name: 'Leonardo', profession: { name: 'doctor' } }

with deep-freeze:

function deepFreeze(object) {
   let propNames = Object.getOwnPropertyNames(object);
   for (let name of propNames) {
      let value = object[name];
      object[name] = value && typeof value === "object" ?
      deepFreeze(value) : value;
   }
   return Object.freeze(object);
}
let person = {
   name: "Leonardo",
   profession: {
      name: "developer"
   }
};
deepFreeze(person);
person.profession.name = "doctor"; // TypeError: Cannot assign to read only property 'name' of object
{{login.error}}