Để 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:

Hàm Deep Freeze

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' } }

Giải thích

  1. Object.freeze(): Hàm này được sử dụng để ngăn chặn bất kỳ thay đổi nào cho đối tượng, bao gồm cả việc thêm, xóa hoặc thay đổi thuộc tính.
  2. Đệ quy: Hàm 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 đó.
  3. Kiểm tra Object.isFrozen(): Để tránh gọi đệ quy vô hạn, hàm kiểm tra xem đối tượng đã được đóng băng chưa trước khi thực hiện việc đóng băng.

Kết luận

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.