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.prototype → null 的链条,就是原型链。它全程自动触发,你没调用任何方法,只是读了一个属性。
__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一键铺货到自己店铺详细步骤
太平洋网站制作公司,网络用语太平洋是什么意思?


