什么是原型_原型链在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限流配置【方法】

