diff --git a/zy-补环境框架/vmProxy_test.js b/zy-补环境框架/vmProxy_test.js new file mode 100644 index 0000000..ca235ea --- /dev/null +++ b/zy-补环境框架/vmProxy_test.js @@ -0,0 +1,47 @@ +window = this; + +// 定义名字 +Object.defineProperties(window, { + [Symbol.toStringTag]:{ + value: "window", + configurable: true + } +}); + + +function vmProxy(o){ + return new Proxy(window, { + set(obj, prop, value) { + // obj 那个对象, prop哪个属性,value设置的值 + console.log(obj, prop, value); + return Reflect.set(...arguments); + }, + get: function (target, property, receiver) { + // obj 那个对象, prop哪个属性,value设置的值 + console.log(target, property, receiver); + return target[property]; + } + }); +} + +// 创建对象的方法 +// object.create({}); +// class window{}; +// function window(){};new window; + +window = vmProxy(window); + +// navigator = {}; +// navigator = vmProxy(navigator); +// +// document = {}; +// document = vmProxy(document); + +location = {}; +location.reload = function reload(){ + +}; + +location = vmProxy(location); +console.log(location.reload+''); + diff --git a/zy-补环境框架/window_proxy.js b/zy-补环境框架/window_proxy.js new file mode 100644 index 0000000..2733f0a --- /dev/null +++ b/zy-补环境框架/window_proxy.js @@ -0,0 +1,18 @@ +window = this; + +// 后代理的检测不到先代理 +window = new Proxy(window, { + set(obj, prop, value) { + // obj 那个对象, prop哪个属性,value设置的值 + console.log(obj, prop, value); + return Reflect.set(...arguments); + }, + get: function (target, property, receiver) { + // obj 那个对象, prop哪个属性,value设置的值 + console.log(target, property, receiver); + return target[property]; + } +}); + +window.ayf = 123; +window.aaa = window.ayf; diff --git a/zy-补环境框架/补环境2.md b/zy-补环境框架/补环境2.md index 541c40d..86f7b4c 100644 --- a/zy-补环境框架/补环境2.md +++ b/zy-补环境框架/补环境2.md @@ -57,7 +57,123 @@ jsdom 是许多 web 标准的纯 JavaScript 实现,特别是 WHATWG DOM和HTML const descriptor1 = Object.getOwnPropertyDescriptor(navigator, 'userAgent'); console.log(descriptor1); -## 代理是什么 +## Proxy 代理是什么 js代码中读了 window.ayf 现在我需要拦截代码 +Proxy 也就是代理,可以帮助我们完成很多事情,例如对数据的处理,对构造函数的处理,对数据的验证,说白了, +就是在我们访问对象前添加了一层拦截,可以过滤很多操作,而这些过滤,由你来定义。 + + https://www.jianshu.com/p/77eaaf34e732 + +官方文档 + + https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Proxy + +我们监听window对象 set + + window = this; + + window = new Proxy(window, { + // obj 那个对象, prop哪个属性,value设置的值 + set(obj, prop, value){ + console.log(obj, prop, value); + return Reflect.set(...arguments); + } + }); + + window.ayf = 123; + +打印输出 + + {} ayf 123 + +我们监听window对象 get + +window = this; + + // 后代理的检测不到先代理 + window = new Proxy(window, { + set(obj, prop, value) { + // obj 那个对象, prop哪个属性,value设置的值 + console.log(obj, prop, value); + return Reflect.set(...arguments); + }, + get: function (target, property, receiver) { + // obj 那个对象, prop哪个属性,value设置的值 + console.log(target, property, receiver); + return target[property]; + } + }); + + window.ayf = 123; + window.aaa = window.ayf; + +打印输出 + + {} ayf 123 + { ayf: 123 } ayf { ayf: 123 } + { ayf: 123 } aaa 123 + +关于检测后代理的检测不到先代理,简单理解事先开启外挂在开启游戏,游戏就检测不到外挂,先开游戏在开启外挂,游戏已经 +加载了外挂,就会拦截你的外挂 + +以此类推设置其他的对象 + + window = this; + + // 定义名字 + Object.defineProperties(window, { + [Symbol.toStringTag]:{ + value: "window", + configurable: true + } + }); + + + function vmProxy(o){ + return new Proxy(window, { + set(obj, prop, value) { + // obj 那个对象, prop哪个属性,value设置的值 + console.log(obj, prop, value); + return Reflect.set(...arguments); + }, + get: function (target, property, receiver) { + // obj 那个对象, prop哪个属性,value设置的值 + console.log(target, property, receiver); + return target[property]; + } + }); + } + + // 创建对象的方法 + // object.create({}); + // class window{}; + // function window(){};new window; + + window = vmProxy(window); + + navigator = {}; + navigator = vmProxy(navigator); + + document = {}; + document = vmProxy(document); + + location = {}; + location = vmProxy(location); + + navigator.ayf = 123; + navigator.aaa = navigator.ayf; + +打印 + + Object [window] {} ayf 123 + Object [window] {} ayf 123 + Object [window] { ayf: 123 } Symbol(nodejs.util.inspect.custom) Object [window] { ayf: 123 } + Object [window] { ayf: 123 } Symbol(Symbol.toStringTag) Object [window] { ayf: 123 } + Object [window] { ayf: 123 } Symbol(Symbol.iterator) Object [window] { ayf: 123 } + Object [window] { ayf: 123 } ayf Object [window] { ayf: 123 } + Object [window] { ayf: 123 } ayf Object [window] { ayf: 123 } + Object [window] { ayf: 123 } aaa 123 + Object [window] { ayf: 123 } aaa 123 +