Để deep-freeze (đóng băng sâu) một đối tượng trong JavaScript, bạn cần đảm bảo rằng tất cả các thuộc tính và giá trị con của đối tượng cũng bị đóng băng. Điều này có thể được thực hiện bằng cách sử dụng hàm đệ quy để duyệt qua tất cả các thuộc tính của đối tượng và áp dụng Object.freeze() cho từng thuộc tính.
Dưới đây là cách bạn có thể thực hiện deep freeze một đối tượng:
function deepFreeze(obj) {
// Đóng băng đối tượng hiện tại
Object.freeze(obj);
// Lặp qua tất cả các thuộc tính của đối tượng
Object.keys(obj).forEach((key) => {
const value = obj[key];
// Nếu thuộc tính là một đối tượng và chưa bị đóng băng
if (value && typeof value === 'object' && !Object.isFrozen(value)) {
deepFreeze(value); // Đệ quy để đóng băng đối tượng con
}
});
return obj; // Trả về đối tượng đã được đóng băng
}
// Ví dụ sử dụng
const person = {
name: 'Alice',
age: 30,
address: {
city: 'Wonderland',
zip: '12345'
}
};
// Đóng băng đối tượng person
deepFreeze(person);
// Thử thay đổi thuộc tính
person.age = 31; // Không có tác dụng
person.address.city = 'New Wonderland'; // Không có tác dụng
console.log(person); // { name: 'Alice', age: 30, address: { city: 'Wonderland', zip: '12345' } }
deepFreeze kiểm tra từng thuộc tính của đối tượng. Nếu thuộc tính là một đối tượng (và không phải là một giá trị nguyên hoặc null), nó sẽ gọi lại chính nó để đóng băng thuộc tính đó.Bằng cách sử dụng hàm deepFreeze, bạn có thể dễ dàng đóng băng một đối tượng và tất cả các đối tượng con của nó, đảm bảo rằng dữ liệu của bạn không thể bị thay đổi sau khi đã được xác định.