什么是JavaScript中的原型链?

发布时间 - 2025-12-26 00:00:00    点击率:
JavaScript原型链是对象继承属性和方法的核心机制,通过__proto__指向构造函数的prototype实现层级查找,最终终止于Object.prototype.__proto__为null,支持手动修改但推荐Object.create()或class extends。

JavaScript中的原型链是对象之间实现属性和方法继承的核心机制,它让一个对象可以访问另一个对象的属性和方法。

每个对象都有一个隐式原型(__proto__

当你创建一个对象(比如 const obj = {}new Date()),这个对象内部会自动关联一个原型对象,即它的 __proto__ 属性。这个属性指向该对象的构造函数的 prototype 对象。

  • obj.__proto__ === Object.prototype(普通对象)
  • [1,2].__proto__ === Array.prototype
  • /abc/.__proto__ === RegExp.prototype

函数有显式的 prototype 属性

只有函数才有 prototype 属性(箭头函数除外),它是被用来作为“原型对象模板”的——当用 new 调用该函数时,新对象的 __proto__ 就会指向这个 prototype

  • function Foo() {}Foo.prototype 是一个对象,默认有 constructor 属性
  • const f = new Foo()f.__proto__ === Foo.prototype

查找属性时会沿原型链向上搜索

当你访问一个对象的属性(如 obj.name),JS 引擎先在对象自身找;没找到,就去 obj.__proto__ 找;还没找到,就继续查 obj.__proto__.__proto__……直到到达 null(原型链终点)。

  • {}.__proto__ === Object.prototype
  • Object.prototype.__proto__ === null(链的尽头)
  • 所以所有对象最终都继承自 Object.prototype 上的方法,比如 toString()hasOwnProperty()

可以手动修改原型链(但不推荐随意操作)

虽然可以通过 Object.setPrototypeOf()__proto__ 修改原型,但会影响性能且不易追踪。更安全的方式是用 Object.create() 创建指定原型的对象,或用 ES6 的 class + extends 实现继承。

  • const child = Object.create(parent)child.__proto__ === parent
  • class B extends A {}B.prototype.__proto__ === A.prototype

基本上就这些。原型链不是黑箱,它是一条清晰、可追溯的属性查找路径,理解它才能真正掌握 JS 的面向对象本质。


# javascript  # es6  # java  # js 


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


相关推荐: Laravel Fortify是什么,和Jetstream有什么关系  大连网站制作公司哪家好一点,大连买房网站哪个好?  微信小程序 wx.uploadFile无法上传解决办法  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  香港服务器WordPress建站指南:SEO优化与高效部署策略  详解jQuery中的事件  Laravel集合Collection怎么用_Laravel集合常用函数详解  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  python中快速进行多个字符替换的方法小结  ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  Linux网络带宽限制_tc配置实践解析【教程】  油猴 教程,油猴搜脚本为什么会网页无法显示?  *服务器网站为何频现安全漏洞?  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  Python企业级消息系统教程_KafkaRabbitMQ高并发应用  Laravel如何创建自定义Artisan命令?(代码示例)  5种Android数据存储方式汇总  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  动图在线制作网站有哪些,滑动动图图集怎么做?  如何有效防御Web建站篡改攻击?  中国移动官方网站首页入口 中国移动官网网页登录  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  Android自定义控件实现温度旋转按钮效果  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  魔方云NAT建站如何实现端口转发?  Laravel如何升级到最新版本?(升级指南和步骤)  Laravel如何使用Blade组件和插槽?(Component代码示例)  EditPlus中的正则表达式实战(5)  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  C++时间戳转换成日期时间的步骤和示例代码  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】  专业商城网站制作公司有哪些,pi商城官网是哪个?  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  如何快速上传自定义模板至建站之星?  如何在景安云服务器上绑定域名并配置虚拟主机?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  Laravel如何实现本地化和多语言支持?(i18n教程)  Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】  如何在万网自助建站平台快速创建网站?  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】