什么是原型_原型链在javascript中如何工作【教程】

发布时间 - 2026-01-25 00:00:00    点击率:
JavaScript中没有类继承,只有基于__proto__的委托查找;原型链是通过__proto__逐级向上查找属性的过程,prototype仅在new调用时用于设置新对象的__proto__。

JavaScript 中没有“类继承”,只有对象之间的委托关系;所谓原型链,就是从一个对象出发,通过 __proto__(或 Object.getPrototypeOf())逐级向上查找属性和方法的过程。

每个函数都有 prototype,但只有函数被用作构造器时它才起作用

声明一个函数时,JS 引擎会自动给它挂上 prototype 属性,值是一个普通对象,带一个 constructor 指回该函数。但它本身不参与任何查找——除非你用 new 调用这个函数。

此时,新对象的 __proto__ 会被设为该函数的 prototype 对象。

  • function Foo() {}Foo.prototype 存在,但没被任何对象直接链接
  • const f = new Foo()f.__proto__ === Foo.prototype 成立
  • const o = {}o.__proto__ === Object.prototype,不是 Function.prototype

__proto__prototype 完全不是一回事

__proto__ 是每个对象(包括函数)都有的内部属性,指向它的原型对象;prototype 是只有函数对象才有的属性,用于指定将来用 new 创建实例时,那些实例的 __proto__ 该指向谁。

  • 误写 obj.prototype.something:普通对象没有 prototype 属性,会得 undefined
  • 误写 Func.__proto__.method:这查的是函数自身的原型(即 Function.prototype),不是它实例的原型
  • 现代写法应优先用 Object.getPrototypeOf(obj) 替代 obj.__proto__,后者是遗留 API

属性查找走的是 __proto__ 链,不是“作用域链”或“闭包链”

你访问 obj.prop,JS 引擎先在 obj 自身找,找不到就去 obj.__proto__ 找,再找不到就继续找 obj.__proto__.__proto__,直到碰到 null(即 Object.prototype.__proto__)为止。

  • 如果某层原型上有同名属性(比如 toString),就会“遮蔽”更上层的定义,不会合并或叠加
  • 修改 obj.__proto__.x = 1 会影响所有共享该原型的对象,但不推荐直接改,容易引发意外共享
  • for...in 遍历包含原型链上的可枚举属性;Object.keys() 只返回自身可枚举属性

真正容易出问题的地方在于:把 prototype 当成实例的“父类模板”来理解,而忽略了它只是被 new 复制过去的一次性链接目标;一旦原型被替换(比如重赋值 Foo.prototype = {}),已创建的实例不会自动更新 __proto__,它们仍指向旧的 prototype 对象。


# javascript  # java  # js  # 作用域 


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


相关推荐: 历史网站制作软件,华为如何找回被删除的网站?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  Swift中switch语句区间和元组模式匹配  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  常州企业网站制作公司,全国继续教育网怎么登录?  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  如何快速辨别茅台真假?关键步骤解析  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  网站制作价目表怎么做,珍爱网婚介费用多少?  微信小程序 input输入框控件详解及实例(多种示例)  linux写shell需要注意的问题(必看)  如何快速搭建自助建站会员专属系统?  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  零基础网站服务器架设实战:轻量应用与域名解析配置指南  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  高端网站建设与定制开发一站式解决方案 中企动力  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  海南网站制作公司有哪些,海口网是哪家的?  Laravel如何使用Blade模板引擎?(完整语法和示例)  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  如何快速搭建个人网站并优化SEO?  瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  Laravel如何自定义分页视图?(Pagination示例)  如何快速搭建高效简练网站?  油猴 教程,油猴搜脚本为什么会网页无法显示?  JavaScript模板引擎Template.js使用详解  简单实现Android验证码  Bootstrap整体框架之JavaScript插件架构  Laravel如何创建自定义Artisan命令?(代码示例)  Python制作简易注册登录系统  js实现点击每个li节点,都弹出其文本值及修改  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  python中快速进行多个字符替换的方法小结  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  Java类加载基本过程详细介绍  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】