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


相关推荐: 如何在宝塔面板中创建新站点?  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  bootstrap日历插件datetimepicker使用方法  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】  Laravel如何记录自定义日志?(Log频道配置)  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  如何快速查询网址的建站时间与历史轨迹?  如何在腾讯云免费申请建站?  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  如何在 Pandas 中基于一列条件计算另一列的分组均值  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  网站建设整体流程解析,建站其实很容易!  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  如何快速启动建站代理加盟业务?  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  html如何与html链接_实现多个HTML页面互相链接【互相】  Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  如何在IIS中新建站点并配置端口与物理路径?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  Laravel如何配置Horizon来管理队列?(安装和使用)  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  如何在Windows环境下新建FTP站点并设置权限?  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  如何快速上传建站程序避免常见错误?  打造顶配客厅影院,这份100寸电视推荐名单请查收  Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  如何在IIS中新建站点并解决端口绑定冲突?  深圳网站制作培训,深圳哪些招聘网站比较好?  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  googleplay官方入口在哪里_Google Play官方商店快速入口指南  活动邀请函制作网站有哪些,活动邀请函文案?  高端云建站费用究竟需要多少预算?  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  canvas 画布在主流浏览器中的尺寸限制详细介绍  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  如何快速搭建高效可靠的建站解决方案?  详解Oracle修改字段类型方法总结  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  太平洋网站制作公司,网络用语太平洋是什么意思?