当前位置: 首页 > 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.jsqmd.com/news/101314/

相关文章:

  • AI时代的云安全(三)合规性挑战的深度解析
  • MapGIS Objects Java三维地形如何实现坡度分析
  • windows11启动进入grub命令行解决方法
  • LobeChat能否对接Zoom?会议中实时AI字幕生成实验
  • Linux系统编程——线程
  • LobeChat能否支持神经渲染?虚拟形象动态表情生成
  • 绝区零游戏自动化终极指南:10分钟从小白到高手
  • Molecular Operating Environment (MOE) 终极完整安装指南:快速掌握药物设计利器
  • 图片转文字技术(三)提升图片转文字与AI翻译准确率的实用技巧与技术实践
  • 基于Java的奖学金评定评优系统的设计与实现
  • 今日总结2
  • 明日提醒
  • FeHelper前端工具终极指南:快速上手的完整教程
  • 汇川中型 PLC 纯 ST 语言双轴同步设备开发:初学者的友好指南
  • FeHelper:重新定义你的前端开发效率边界
  • LobeChat用户故事征集:分享你的创新应用场景
  • 12-16午夜盘思
  • MusicFree终极定制指南:3步打造你的专属音乐宇宙
  • Kafka单机搭建(二)
  • 【开题答辩全过程】以 基于Android的环卫人员管理系统设计与实现为例,包含答辩的问题和答案
  • BGE-Large-zh-v1.5终极部署指南:3步搞定文本嵌入模型实战
  • Mac微信防撤回插件WeChatIntercept:终极完整使用指南
  • 2.2新一代信息技术及应用
  • 【开题答辩全过程】以 高校电子教室在线考试系统为例,包含答辩的问题和答案
  • 无奖
  • FeHelper:颠覆传统的前端开发效率倍增器
  • C++ asio网络编程(2) buffer同步读写
  • Video DownloadHelper CoApp 深度解析:视频下载增强工具完整配置方案
  • pip - pip._vendor.resolvelib.resolvers.ResolutionTooDeep: 200000
  • Flutter 进阶:构建高性能跨平台应用的实践与技巧