沙箱隔离(快照隔离)——适用于单应用
保存当前的变化,切换到另外一个的时候就恢复上一个属性
// 快照方式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)
