常用的方法
以下方法都是使用了基础方法进行封装,同时除错误堆栈跟踪、重定向toString
replaceWithProxy
用一个proxy重写方法
replaceWithProxy(WebGLRenderingContext.prototype, 'getParameter', proxyHandler)
相似
replaceObjPathWithProxy
由前者封装,可以说是一个简化的方法
replaceObjPathWithProxy('WebGLRenderingContext.prototype.getParameter', proxyHandler)
replaceGetterWithProxy
用一个proxy替换属性
replaceGetterWithProxy(Object.getPrototypeOf(navigator), 'vendor', proxyHandler)
mockWithProxy
用一个proxy模拟方法
mockWithProxy(chrome.runtime, 'sendMessage', function sendMessage() {}, proxyHandler)
基础方法
replaceProperty
以隐形的方式替换一个对象的属性
replaceProperty(WebGLRenderingContext.prototype, 'getParameter', { value: "alice" })
replaceProperty(Object.getPrototypeOf(navigator), 'languages', { get: () => ['en-US', 'en'] })
patchToString
用来修改所提供对象的’ toString() '结果的辅助函数
patchToString(WebGLRenderingContext.prototype.getParameter, 'function getParameter() { [native code] }')
redirectToString
将toString请求从一个对象重定向到另一个对象
stripProxyFromErrors
把伪装的信息从报错的堆栈中剔除
从源码获得的一些领悟
- 可以从错误堆栈去检测函数是否被重写
- 直接用Object.defineProperty重写方法,通过以下检测均可以发现
- toString
- name
- length
- Function.prototype.toString.call