- 判断浏览器是否支持Proxy
- 浏览器支持Proxy,则使用Proxy实现JS沙箱
- 实现一个Set对象记录window值的变更。这个Set对象没有起到太大的作用,它只是在失活的时候console.info下。
- 新建一个fakeWindow,fakeWindow上是window对象上可以修改和删除的属性。每一个子应用都有自己的fakeWindow。
- 使用Proxy创建fakeWindow的代理
- 新增时Set对象添加一条记录
- 删除时Set对象删除一条记录
- 用沙箱代理作为接下来的全局对象
- 执行js,传入js沙箱代理
- 使用一个函数
(function({...}))
包裹待执行的js代码块。
-
使用
(function(window){with(window){...}}).bind(window.proxy)
这种方式使得,js代码块中的window变成了fakeWindow的代理。用户修改window实际是修改fakeWindow。并且修改的内容被Set对象记录。 -
从window获取某个key的value时,先判断fakeWindow上是否存在这个key,存在的话就从fakeWindow上面获取,不存在则从window上获取。
这里应该就是proxy代理发挥作用的地方
。