Tôi quyết định nhắc lại nhận xét của mình cho câu trả lời của Pumbaa80 dưới dạng câu trả lời riêng biệt để việc sử dụng lại nó làm thư viện dễ dàng hơn.
Tôi đã lấy mã của Pumbaa80, tinh chỉnh một chút, thêm các bài kiểm tra và xuất bản nó dưới dạng mô-đun npm tại đây:
https://www.npmjs.com/package/mock-local-storage .
Đây là một mã nguồn:
https://github.com/letsrock-today/mock-local-storage/blob/master/src/mock-localstorage.js
Một số bài kiểm tra:
https://github.com/letsrock-today/mock-local-storage/blob/master/test/mock-localstorage.js
Mô-đun tạo localStorage giả và sessionStorage trên đối tượng toàn cục (cửa sổ hoặc toàn cục, đối tượng nào trong số chúng được xác định).
Trong các thử nghiệm dự án khác của tôi, tôi yêu cầu nó với mocha như sau: mocha -r mock-local-storage
để cung cấp các định nghĩa toàn cầu cho tất cả các mã đang thử nghiệm.
Về cơ bản, mã trông như sau:
(function (glob) {
function createStorage() {
let s = {},
noopCallback = () => {},
_itemInsertionCallback = noopCallback;
Object.defineProperty(s, 'setItem', {
get: () => {
return (k, v) => {
k = k + '';
_itemInsertionCallback(s.length);
s[k] = v + '';
};
}
});
Object.defineProperty(s, 'getItem', {
// ...
});
Object.defineProperty(s, 'removeItem', {
// ...
});
Object.defineProperty(s, 'clear', {
// ...
});
Object.defineProperty(s, 'length', {
get: () => {
return Object.keys(s).length;
}
});
Object.defineProperty(s, "key", {
// ...
});
Object.defineProperty(s, 'itemInsertionCallback', {
get: () => {
return _itemInsertionCallback;
},
set: v => {
if (!v || typeof v != 'function') {
v = noopCallback;
}
_itemInsertionCallback = v;
}
});
return s;
}
glob.localStorage = createStorage();
glob.sessionStorage = createStorage();
}(typeof window !== 'undefined' ? window : global));
Lưu ý rằng tất cả các phương thức được thêm qua Object.defineProperty
để chúng không bị lặp lại, bị truy cập hoặc bị xóa như các mục thông thường và sẽ không được tính về độ dài. Ngoài ra, tôi đã thêm một cách để đăng ký gọi lại được gọi khi một mục sắp được đưa vào đối tượng. Lệnh gọi lại này có thể được sử dụng để mô phỏng lỗi vượt quá hạn ngạch trong các thử nghiệm.
Profit!