1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| //观察框架 !(function () { var console_log = console.log watch = function (obj, name) { return new Proxy(obj, { get(target, p, receiver) { // 过滤没用的信息,不进行打印 if (name !== 'contentWindow' && p === "Math" || p === "JSON" || p === "RegExp" || p === "atob" || p === "parseInt" || p === "String" || p === "Symbol" || p === "Proxy" || p === "Promise" || p === "Array" || p === "isNaN" || p === "encodeURI" || p === "Uint8Array" || p.toString().indexOf("Symbol(Symbol.") != -1 || p.toString().indexOf("Symbol(nodejs") != -1) { var val = Reflect.get(...arguments); return val } else { var val = Reflect.get(...arguments); if (typeof val === 'function') { console_log(`取值: ${name}.${p} => function`); } else { console_log(`取值: ${name}.${p} => ${val}`); } return val } }, set(target, p, value, receiver) { var val = Reflect.set(...arguments) if (typeof value === 'function') { console_log(`设置值: ${name}.${p} => function`,); } else { console_log(`设置值: ${name}.${p} => ${value}`); } return val }, has(target, key) { // 在检查属性存在性时输出一条消息 console_log(`检查属性存在性: ${name}.${key.toString()}`); return key in target; }, ownKeys(target) { console_log(`获取自有属性:${name}`) if (name === 'contentWindow_navigator') { return watch([], 'contentWindow_navigator自有属性') } return Reflect.ownKeys(target) } }) } })();
// 补环境框架 function getEnvs(proxyObjs) { for (let i = 0; i < proxyObjs.length; i++) { const handler = '{\n' + ' get: function(target, property, receiver) {\n' + ' console.log("方法:", "get ", "对象:", ' + '"' + proxyObjs[i] + '" ,' + '" 属性:", property, ' + '" 属性类型:", ' + 'typeof property, ' + // '" 属性值:", ' + 'target[property], ' + '" 属性值类型:", typeof target[property]);\n' + // 'if (typeof target[property] == "undefined"){debugger}' + ' return target[property];\n' + ' },\n' + ' set: function(target, property, value, receiver) {\n' + ' console.log("方法:", "set ", "对象:", ' + '"' + proxyObjs[i] + '" ,' + '" 属性:", property, ' + '" 属性类型:", ' + 'typeof property, ' + // '" 属性值:", ' + 'target[property], ' + '" 属性值类型:", typeof target[property]);\n' + ' return Reflect.set(...arguments);\n' + ' }\n' + '}'; eval(`try { ${proxyObjs[i]}; ${proxyObjs[i]} = new Proxy(${proxyObjs[i]}, ${handler}); } catch (e) { ${proxyObjs[i]} = {}; ${proxyObjs[i]} = new Proxy(${proxyObjs[i]}, ${handler}); }`); } }
proxyObjs = ['window', 'location', 'document', 'navigator', 'history', 'screen', 'localStorage'] getEnvs(proxyObjs);
|