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 】
相关推荐:
三星网站视频制作教程下载,三星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进行数据交换_它有什么限制


