沙箱隔离(快照隔离)——适用于单应用
保存当前的变化,切换到另外一个的时候就恢复上一个属性
// 快照方式
class SnapshotSandbox {
constructor() {
this.proxy = window;
this.modifyPropsMap = {};
this.active();
}
active() {
this.windowSnapShot = {};
// 现保存一份最开始的
for(const prop in window) {
if (window.hasOwnProperty(prop)) {
this.windowSnapShot[prop] = window[prop];
}
}
// 将之前修改的变化赋值到当前激活状态下的值,相当于恢复上一次的修改
Object.keys(this.modifyPropsMap).forEach(p => {
window[p] = this.modifyPropsMap[p];
})
}
unActive() {
for(const prop in window) {
if (window.hasOwnProperty(prop)) {
// 判断跟一年前是不是一样,不一样就保存一下变化
if (window[prop] !== this.windowSnapShot[prop]){
this.modifyPropsMap[prop] = window[prop];
// 恢复上一次的window,这样可以确保反复失活和激活拿到正常的状况
window[prop] = this.windowSnapShot[prop];
}
}
}
}
}
let sandBox = new SnapshotSandbox();
((window) => {
window.a = 1;
window.b = 2;
console.log(window.a, window.b);
sandBox.unActive();
console.log(window.a, window.b);
sandBox.active();
console.log(window.a, window.b);
})(sandBox.proxy)