Làm sao để deep-freeze
một đối tượng trong JavaScript?
Làm sao để deep-freeze
một đối tượng trong JavaScript?
Để "deep-freeze" một đối tượng trong JavaScript, bạn cần sử dụng phương thức Object.freeze()
kết hợp với đệ quy. Phương thức Object.freeze()
ngăn chặn việc thêm mới, xóa bỏ, hoặc thay đổi các thuộc tính của đối tượng, cũng như ngăn chặn việc thay đổi prototype của đối tượng. Tuy nhiên, Object.freeze()
chỉ áp dụng một "shallow freeze", nghĩa là nó chỉ đóng băng các thuộc tính trực tiếp của đối tượng và không áp dụng cho các đối tượng lồng nhau. Để đạt được một "deep freeze", bạn cần áp dụng đệ quy để đóng băng mọi đối tượng lồng nhau
Dưới đây là một ví dụ về cách thực hiện "deep freeze" một đối tượng:
function deepFreeze(object) {
// Lấy tất cả tên thuộc tính của đối tượng
const propNames = Reflect.ownKeys(object);
// Đóng băng các thuộc tính trước khi đóng băng chính đối tượng
for (const name of propNames) {
const value = object[name];
if ((value && typeof value === "object") || typeof value === "function") {
deepFreeze(value);
}
}
return Object.freeze(object);
}
const obj2 = {
internal: {
a: null,
},
};
deepFreeze(obj2);
obj2.internal.a = "anotherValue"; // Thay đổi này sẽ không có hiệu lực
Trong ví dụ trên, hàm deepFreeze
sẽ đệ quy qua tất cả các thuộc tính của đối tượng. Nếu một thuộc tính là một đối tượng hoặc một hàm, hàm deepFreeze
sẽ được gọi đệ quy cho thuộc tính đó trước khi đóng băng chính đối tượng. Cuối cùng, Object.freeze()
được gọi để đóng băng đối tượng. Kết quả là, bạn không thể thay đổi, thêm mới, hoặc xóa bỏ bất kỳ thuộc tính nào của đối tượng, kể cả trong các đối tượng lồng nhau
Lưu ý rằng việc sử dụng "deep freeze" có thể ảnh hưởng đến hiệu suất nếu đối tượng có cấu trúc phức tạp và lồng nhau sâu. Do đó, hãy cân nhắc kỹ trước khi áp dụng cho toàn bộ đối tượng lớn hoặc phức tạp.
middle
Gợi ý câu hỏi phỏng vấn
Chưa có bình luận nào