javascript原型链是什么以及它如何工作?【教程】

发布时间 - 2026-01-28 00:00:00    点击率:
JavaScript原型链是对象属性查找的真实路径,从obj.__proto__开始逐级向上查找至null;__proto__指向对象的[[Prototype]],函数的prototype属性则作为new实例的[[Prototype]]。

JavaScript 原型链不是“继承机制的模拟”,而是对象属性查找的真实路径——它直接决定 obj.method() 能不能找到、找的是谁的 method

原型链从哪里开始?__proto__prototype 到底谁指向谁

每个对象(除 Object.create(null))都有一个内部属性 [[Prototype]],可通过 obj.__proto__(非标准但广泛支持)或 Object.getPrototypeOf(obj) 访问。而函数对象额外拥有 prototype 属性——它只在该函数被用作构造函数时,成为新实例的 [[Prototype]]

关键关系:

  • new Foo().__proto__ === Foo.prototype
  • Foo.prototype.constructor === Foo(默认情况下)
  • Object.prototype.__proto__ === null(链的终点)

属性查找怎么走完这条链?一次失败可能不是没定义,而是没走到对的位置

当你访问

obj.x,JS 引擎不会只查 obj 自身,而是按顺序遍历整个 [[Prototype]] 链,直到找到第一个匹配的 x 或抵达 null

常见误判场景:

  • obj.x = 1 后再读 obj.x,永远返回 1 —— 不会继续向上找,哪怕原型上也有 x
  • hasOwnProperty('x') 只检查自身,不走原型链;而 'x' in obj 会走
  • 箭头函数没有 prototype,不能被 new,也没有自己的 [[Prototype]] 链起点

修改原型会影响已有实例吗?是的,但赋值操作会“遮蔽”它

原型对象本身是普通对象,所有共享它的实例都引用同一个原型对象。所以:

  • Foo.prototype.bar = function(){} 后,所有已存在的 new Foo() 实例立刻能调用 .bar()
  • 但如果某个实例已自行设置 obj.bar = ...,那后续调用 obj.bar() 就不会再沿链查找,因为自身属性优先
  • obj.__proto__ = {} 会切断原有链(不推荐),但 Object.setPrototypeOf(obj, {}) 更安全且可逆

现代写法里还要手动管原型链吗?类语法只是糖,底层照旧

class 语法不改变原型链本质:class B extends A 等价于设置 B.prototype.__proto__ === A.prototype,并确保 super() 正确初始化 this

真正容易出错的地方:

  • Object.assign(B.prototype, {...}) 混入方法时,会覆盖 B.prototype.constructor,需手动修复
  • Reflect.construct()new.target 在自定义构造逻辑中才暴露原型链控制细节
  • ES6 模块导出的对象、JSON.parse() 的结果,都没有连接到你期望的原型,它们的 __proto__Object.prototype

原型链不是黑箱,但它依赖“对象创建时绑定的 [[Prototype]]”和“运行时只读的查找规则”——一旦理解这两点,所有看似魔幻的行为(比如为什么数组有 push 却没定义它)就只是路径查找的结果而已。最容易被忽略的是:**链上任何一环被意外赋值(如 Array.prototype.push = null),影响的是所有数组实例,且无法通过重定义构造函数来绕过。**


# javascript  # es6  # java  # js  # json  # 为什么  # Array  # Object  # NULL  # 构造函数  # 继承  # class 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 微信小程序 canvas开发实例及注意事项  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  手机网站制作与建设方案,手机网站如何建设?  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  JavaScript中的标签模板是什么_它如何扩展字符串功能  Laravel怎么上传文件_Laravel图片上传及存储配置  js实现点击每个li节点,都弹出其文本值及修改  如何在万网自助建站中设置域名及备案?  Laravel如何记录自定义日志?(Log频道配置)  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  深圳网站制作平台,深圳市做网站好的公司有哪些?  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  如何用腾讯建站主机快速创建免费网站?  如何快速搭建安全的FTP站点?  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  如何在云指建站中生成FTP站点?  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  🚀拖拽式CMS建站能否实现高效与个性化并存?  jQuery validate插件功能与用法详解  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  如何快速上传建站程序避免常见错误?  如何在云主机快速搭建网站站点?  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  Laravel怎么在Blade中安全地输出原始HTML内容  创业网站制作流程,创业网站可靠吗?  javascript基于原型链的继承及call和apply函数用法分析  Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例  如何破解联通资金短缺导致的基站建设难题?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  网站优化排名时,需要考虑哪些问题呢?  如何在自有机房高效搭建专业网站?  佛山企业网站制作公司有哪些,沟通100网上服务官网?  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  详解MySQL数据库的安装与密码配置  Laravel如何优化应用性能?(缓存和优化命令)  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  Laravel用户密码怎么加密_Laravel Hash门面使用教程  Python文件异常处理策略_健壮性说明【指导】  如何彻底删除建站之星生成的Banner?  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程