当前位置: 首页 > news >正文

原型链简易了解

后面会出几篇自定义补环境框架的文章,在讲解环境框架之前,需要对原型链有简单的了解

相信有不少人有一个误区,觉得手补环境才是最好的,因为灵活方便,不想使用补环境框架,因为复杂。

其实根本原因归结于过于依赖吐环境代理,吐环境代理并不万能,很多时候很多环境并不能吐出业务代码真正执行的流程,甚至有时吐出的代理会让你走进错误分支。首先任何业务代码都要遵循加密执行逻辑,而不是吐什么补什么,谨住这一点!!

首先何为原型链,是指将一个对象指向另一个对象,通过使用obj.__proto__ 或 Object.getPrototypeOf(obj)能看导其结构

比如document.__proto__是HTMLDocument

而HTMLDocument的__proto__是Document

Document的__proto__是Node

Node的__proto__是EventTarget

这种层层相连的关系就是原型链,值得注意的是,下级可以继承上级对象的属性,而上级不能使用下级的自身属性

比如你们常见的addEventListener事件是EventTarget的属性,而继承EventTarget对象的Node, Document, HTMLDocument, document都能调用addEventListener

很好理解吧?你们手补的document对象补addEventListener方法,然后又在windows对象手补addEventListener方法,这种东凑西补的方法,当遇到了补环境要求特别高的代码,会补的眼花缭乱,混乱复杂。

那我们在nodejs中,为了完全模拟伪造这种原型链,代码如下:

EventTarget = function EventTarget() {}; EventTarget.prototype.addEventListener = function addEventListener() {}; Node = function Node() {}; Object.setPrototypeOf(Node.prototype, EventTarget.prototype) Document = function Document() {}; Object.setPrototypeOf(Document.prototype, Node.prototype) HTMLDocument = function HTMLDocument() {}; Object.setPrototypeOf(HTMLDocument.prototype, Document.prototype) document = {}; Object.setPrototypeOf(document, HTMLDocument.prototype) console.log(document) console.log(document.addEventListener)

看,这就成功初步模拟伪造了浏览器环境 关于toString检测又是怎么过呢?

这是浏览器环境

这是nodejs的

最简单的做法是

document.toString = function (){

return '[object HTMLDocument]'

}

document.addEventListener.toString = function (){

return 'function addEventListener() { [native code] }'

}

这样就把toString检测过了。当然了,正常肯定不是这样补的 这种做法太过儿科了 至于属性描述符检测,不用过多赘述了 了解完原型链之后,就算成功摸入创建自定义环境环境的门槛了,后面有时间再出如何自定义环境框架的文章

感兴趣的联系我,加入知识星球

http://www.cnnetsun.cn/news/93580.html

相关文章:

  • 速藏!AI大模型工程师进阶手册:从入门到实战的全攻略
  • NVIDIA Profile Inspector终极优化指南:解锁显卡隐藏性能
  • Ubuntu执行apt-get update报错:W: 无法下载 http://cn.mirrors.ustc.edu.cn/ubuntu/dists/bionic/InRelease 连接失败
  • LobeChat能否对接古籍数据库?中华传统文化智能问答系统
  • 微信多设备登录难题的终极解决方案
  • PlayCover深度解密:在Mac上畅享iOS应用的终极方案
  • RGBD slam
  • BBDown完全指南:轻松下载B站视频的5大实用技巧
  • 历时两年多,“水下大疆”IPO又有新进展! 深之蓝海洋科技股
  • MusicFree插件完全指南:解锁个性化音乐体验的终极教程
  • 显卡驱动终极清理方案:Display Driver Uninstaller完整使用指南
  • 5分钟从入门到精通!PandaWiki:零代码小白的AI编程助手
  • 基于JAVA的图书馆图书资源检索借阅系统
  • 原神自动化脚本7大实用技巧:新手也能快速上手的完整指南
  • 基于Java的奖学金评定评优系统的设计与实现
  • 03-编写和运行Playbook
  • 如何用Locale Emulator实现完美区域语言模拟:新手终极指南
  • Java与操作系统常用命令交互全解析
  • Mac微信防撤回插件WeChatIntercept:终极完整使用指南
  • LobeChat能否实现AI律师函撰写?法律文书自动化产出
  • 基于Python的在线零食购物商城系统的设计与实现
  • 小爱音箱AI升级终极指南:三步打造你的智能语音管家
  • 如何设计吸引眼球的放假通知图片
  • Wallpaper Engine终极下载指南:免费获取创意工坊壁纸的完整教程
  • 终极指南:如何用QtScrcpy实现零延迟Android投屏控制
  • 华为认证的证书含金量到底怎么样?谁适合考?谁没必要浪费时间?
  • 六音音源重生之路:让洛雪音乐重获新生
  • QtScrcpy跨平台投屏终极指南:让你的手机在电脑上“活“起来
  • 鸣潮自动化工具终极指南:5分钟实现全自动游戏体验
  • 百度网盘提取码智能获取工具使用全攻略