https://github.com/daisixuan/r0chrome
使用chromium查看js使用那些环境
dtavm = {} dtavm.log = console.log dtavm.proxy = function (obj, objname, type) { function getMethodHandler(WatchName, target_obj) { let methodhandler = { apply(target, thisArg, argArray) { if (this.target_obj) { thisArg = this.target_obj } let result = Reflect.apply(target, thisArg, argArray) if (target.name !== "toString") { if (target.name === "addEventListener") { dtavm.log(`调用者 => [${WatchName}] 函数名 => [${target.name}], 传参 => [${argArray[0]}], 结果 => [${result}].`) } else if (WatchName === "window.console") { } else { dtavm.log(`调用者 => [${WatchName}] 函数名 => [${target.name}], 传参 => [${argArray}], 结果 => [${result}].`) } } else { dtavm.log(`调用者 => [${WatchName}] 函数名 => [${target.name}], 传参 => [${argArray}], 结果 => [${result}].`) } return result }, construct(target, argArray, newTarget) { var result = Reflect.construct(target, argArray, newTarget) dtavm.log(`调用者 => [${WatchName}] 构造函数名 => [${target.name}], 传参 => [${argArray}], 结果 => [${(result)}].`) return result; } } methodhandler.target_obj = target_obj return methodhandler } function getObjhandler(WatchName) { let handler = { get(target, propKey, receiver) { let result = target[propKey] if (result instanceof Object) { if (typeof result === "function") { dtavm.log(`调用者 => [${WatchName}] 获取属性名 => [${propKey}] , 是个函数`) return new Proxy(result, getMethodHandler(WatchName, target)) } else { dtavm.log(`调用者 => [${WatchName}] 获取属性名 => [${propKey}], 结果 => [${(result)}]`); } return new Proxy(result, getObjhandler(`${WatchName}.${propKey}`)) } if (typeof (propKey) !== "symbol") { dtavm.log(`调用者 => [${WatchName}] 获取属性名 => [${propKey?.description ?? propKey}], 结果 => [${result}]`); } return result; }, set(target, propKey, value, receiver) { if (value instanceof Object) { dtavm.log(`调用者 => [${WatchName}] 设置属性名 => [${propKey}], 值为 => [${(value)}]`); } else { dtavm.log(`调用者 => [${WatchName}] 设置属性名 => [${propKey}], 值为 => [${value}]`); } return Reflect.set(target, propKey, value, receiver); }, has(target, propKey) { var result = Reflect.has(target, propKey); dtavm.log(`针对in操作符的代理has=> [${WatchName}] 有无属性名 => [${propKey}], 结果 => [${result}]`) return result; }, deleteProperty(target, propKey) { var result = Reflect.deleteProperty(target, propKey); dtavm.log(`拦截属性delete => [${WatchName}] 删除属性名 => [${propKey}], 结果 => [${result}]`) return result; }, defineProperty(target, propKey, attributes) { var result = Reflect.defineProperty(target, propKey, attributes); dtavm.log(`拦截对象define操作 => [${WatchName}] 待检索属性名 => [${propKey}] 属性描述 => [${(attributes)}], 结果 => [${result}]`) return result }, getPrototypeOf(target) { var result = Reflect.getPrototypeOf(target) dtavm.log(`被代理的目标对象 => [${WatchName}] 代理结果 => [${(result)}]`) return result; }, setPrototypeOf(target, proto) { dtavm.log(`被拦截的目标对象 => [${WatchName}] 对象新原型==> [${(proto)}]`) return Reflect.setPrototypeOf(target, proto); }, preventExtensions(target) { dtavm.log(`方法用于设置preventExtensions => [${WatchName}] 防止扩展`) return Reflect.preventExtensions(target); }, isExtensible(target) { var result = Reflect.isExtensible(target) dtavm.log(`拦截对对象的isExtensible() => [${WatchName}] isExtensible, 返回值==> [${result}]`) return result; }, } return handler; } if (type === "method") { return new Proxy(obj, getMethodHandler(objname, obj)); } return new Proxy(obj, getObjhandler(objname)); } Object.defineProperties(globalThis, { 'window': { configurable: false, enumerable: true, get: function get() { return dtavm.proxy(window_dta, "window") }, set: undefined }, 'navigator': { configurable: true, enumerable: true, get: function get() { return dtavm.proxy(navigator_dta, "navigator") }, set: undefined }, 'document': { configurable: false, enumerable: true, get: function get() { return dtavm.proxy(document_dta, "document") }, set: undefined }, 'history': { configurable: true, enumerable: true, get: function get() { return dtavm.proxy(history_dta, "history") }, set: undefined }, }) screen = dtavm.proxy(screen_dta, "screen");
下断点执行
成功监控对象