javascript中的原型链是什么?【教程】

发布时间 - 2026-02-01 00:00:00    点击率:
原型链是JavaScript对象查找属性时自动遵循的隐式路径:先查自身,再沿__proto__逐级向上直到null;__proto__指向构造函数的prototype;hasOwnProperty等方法来自Object.prototype,推荐用Object.hasOwn()替代。

原型链不是语法结构,而是 JavaScript 对象查找属性时自动遵循的一条隐式路径。理解它不靠背概念,而靠看属性访问时到底发生了什么。

对象读取属性时,引擎怎么找?

当你写 obj.name,JavaScript 引擎不会只查 obj 自身有没有 name 属性,而是按顺序检查:

  • 先查 obj 自身的属性(Object.

    hasOwn(obj, 'name')
    可确认)
  • 如果没有,就去查 obj.__proto__(即 Object.getPrototypeOf(obj))上的 name
  • 如果还没找到,继续查 obj.__proto__.__proto__,直到为 null 为止

这条从实例 → 构造函数原型 → Object.prototypenull 的链条,就是原型链。它全程自动触发,你没调用任何方法,只是读了一个属性。

__proto__prototype 到底谁指向谁?

这是最容易绕晕的地方:两者名字像,但作用对象和时机完全不同。

  • Function.prototype 是函数对象自带的属性,指向该函数作为构造器时,其实例将共用的那个原型对象
  • obj.__proto__ 是普通对象的内部属性(已不推荐直接访问),它的值等于创建 obj 的构造函数的 prototype
  • 比如 const arr = [],那么 arr.__proto__ === Array.prototype,而 Array.prototype.__proto__ === Object.prototype

别试图“改 __proto__ 来改变继承”,现代代码应统一用 Object.setPrototypeOf()class 语法,否则容易破坏 V8 的内联缓存优化。

为什么 hasOwnProperty 不在自己身上却能用?

因为 obj.hasOwnProperty('x') 是从原型链上借来的——obj.__proto__Object.prototype,而 hasOwnProperty 就定义在那上面。

  • 你可以用 obj.hasOwnProperty.call(someObj, 'x') 避免被子类重写覆盖
  • 但更安全的做法是用 Object.hasOwn(obj, 'x')(ES2025 新增),它不走原型链,直接查自身属性
  • 注意:for...in 会遍历整个原型链上的可枚举属性,而 Object.keys() 只返回自身的

原型链让方法复用成为可能,但也意味着修改 Object.prototype 会影响所有对象——这种操作在生产环境等同于埋雷。

class 写法时,原型链还在吗?

在。class 只是语法糖,底层仍是基于原型的机制。

  • class B extends A {} 会自动设置 B.prototype.__proto__ === A.prototype
  • new B()__proto__ 指向 B.prototype,再往上才是 A.prototype,最后是 Object.prototype
  • 箭头函数没有 prototype,不能当构造函数;普通函数即使没用 new,也有 prototype 属性(值为 {constructor: fn}

真正难调试的,往往不是链本身,而是某处意外覆盖了 constructor 或篡改了 __proto__,导致 instanceof 失效、或 new 实例后找不到预期方法。


# javascript  # java  # 为什么  # Array  # Object  # NULL  # for  # 子类  # 构造函数  # const  # 继承  # class  # function  # 对象  # constructor  # prototype  # 这是  # 也有  # 还没  # 还在  # 隐式  # 才是  # 找不到  # 可以用  # 遍历  # 是从 


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


相关推荐: 三星网站视频制作教程下载,三星w23网页如何全屏?  Laravel distinct去重查询_Laravel Eloquent去重方法  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  EditPlus 正则表达式 实战(3)  如何快速配置高效服务器建站软件?  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  Laravel PHP版本要求一览_Laravel各版本环境要求对照  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  Linux系统运维自动化项目教程_Ansible批量管理实战  Internet Explorer官网直接进入 IE浏览器在线体验版网址  如何选择PHP开源工具快速搭建网站?  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  php485函数参数是什么意思_php485各参数详细说明【介绍】  如何快速重置建站主机并恢复默认配置?  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  详解jQuery中基本的动画方法  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  如何快速搭建虚拟主机网站?新手必看指南  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  如何快速辨别茅台真假?关键步骤解析  Laravel如何实现API速率限制?(Rate Limiting教程)  Laravel如何实现文件上传和存储?(本地与S3配置)  Python文件流缓冲机制_IO性能解析【教程】  Python面向对象测试方法_mock解析【教程】  Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率  Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  iOS正则表达式验证手机号、邮箱、身份证号等  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  高防服务器如何保障网站安全无虞?  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  如何做网站制作流程,*游戏网站怎么搭建?  Java类加载基本过程详细介绍  JavaScript数据类型有哪些_如何准确判断一个变量的类型  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  5种Android数据存储方式汇总  香港服务器部署网站为何提示未备案?  bing浏览器学术搜索入口_bing学术文献检索地址  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  如何快速搭建二级域名独立网站?  Firefox Developer Edition开发者版本入口  怎样使用JSON进行数据交换_它有什么限制