当前位置: 首页 > news >正文

内存视角看「类、原型、实例」

看山是山,看山不是山,看山又是山。

目录

  • 代码
  • 内存分布(抽象图)
  • 分析步骤
    • 类 Person
    • Person.prototype
    • 实例 p1
    • 方法查找
  • 栈和堆存什么?
    • 代码打印验证
  • 总结:

代码

class Person {constructor(name, age) {this.name = namethis.age = age}speak() {console.log(`我叫${this.name},今年${this.age}`)}
}const p1 = new Person("张三", 22)

内存分布(抽象图)

【栈内存】                           【堆内存】
───────────────────────────── ───────────────────────────────
变量名    → 引用地址               实际对象内容Person ───────┐                 Function 对象(类构造函数){│                   prototype: { constructor: f, speak: f }}[0x001] ──────────────────────────────┐│
p1 ──────────┐                                 ││                                 ▼▼                       { name: "张三", age: 22 }[0x002] --------------------→   __proto__ → Person.prototype

分析步骤

类 Person

  • 本质是一个 构造函数对象存在栈内存中,有引用指向堆内存的函数体)。
  • 在内存中会自动生成一个 Person.prototype 对象,里面存放方法(如 speak)。

Person.prototype

  • 存在于堆内存中。
  • 存放实例共享的方法(speak)和一个默认的 constructor 属性(指回 Person)。

实例 p1

  • 存在于堆内存中【实例的引用在栈,实例的实际数据在堆】,里面存放的是 独有的属性:{ name: “张三”, age: 22 }。
  • 它的 proto(隐藏属性,标准叫 [[Prototype]])指向 Person.prototype。

方法查找

  • 当执行 p1.speak() 时:
    • 先在 p1 自己身上查找 speak → 找不到
    • 顺着 proto 去 Person.prototype 找 → 找到并执行

栈和堆存什么?

  • 栈:存放基本类型值、引用地址、执行上下文等。
  • 堆:存放对象的实际内容(包括实例、原型对象、函数对象)。

代码打印验证

console.log(typeof Person) // "function" → 说明类本质是构造函数
console.log(Person.prototype) // { constructor: f, speak: f }
console.log(p1.__proto__ === Person.prototype) // true
console.log(p1.constructor === Person) // true

总结:

  • 类本质是函数(存在栈内存里),它有一个自动生成的 prototype 对象(存在堆内存里)。
  • 实例存在堆内存,存放独有属性;共享方法放在原型对象上。
  • 实例通过 proto 链接到类的 prototype,形成 原型链。

文章转载自:

http://Av1M05ld.qLrtd.cn
http://W1tyxKxA.qLrtd.cn
http://WsYGLfEF.qLrtd.cn
http://hPcJ7HX0.qLrtd.cn
http://h8xvNZt0.qLrtd.cn
http://N5zxYFqO.qLrtd.cn
http://b16CHGwI.qLrtd.cn
http://2vhEalYc.qLrtd.cn
http://h9eoX5IG.qLrtd.cn
http://OgdtwC1z.qLrtd.cn
http://Q4w07pP6.qLrtd.cn
http://Khbt5mqf.qLrtd.cn
http://yKgyki5i.qLrtd.cn
http://uyXIqJLn.qLrtd.cn
http://C45JE5Vm.qLrtd.cn
http://IUJWMQUp.qLrtd.cn
http://wDSLMWwz.qLrtd.cn
http://1tLJNX0v.qLrtd.cn
http://xjldDNww.qLrtd.cn
http://xtdFa5rZ.qLrtd.cn
http://8h9GLmxn.qLrtd.cn
http://Q8Ylhri2.qLrtd.cn
http://ybbMg2AK.qLrtd.cn
http://fhqNM34R.qLrtd.cn
http://ypEC8ygX.qLrtd.cn
http://ReBEJWt5.qLrtd.cn
http://zBNns2yq.qLrtd.cn
http://hKs1O57b.qLrtd.cn
http://YA2hS6VY.qLrtd.cn
http://cw2dT8a3.qLrtd.cn
http://www.dtcms.com/a/375460.html

相关文章:

  • 「类 vs 实例」对比 ,「类 - 原型 - 实例」的关系
  • sft冷启动时数据集构造需要注意哪些因素?为什么要做数据清洗与均衡采样?
  • OpenCV 模板匹配代码深度解析与应用场景全景分析
  • 2026年ESWA SCI1区TOP,适应性社会流动性重构差分进化算法ASMRDE,深度解析+性能实测
  • 中国移动云电脑一体机-创维LB2004_瑞芯微RK3566_2G+32G_开启ADB ROOT安卓固件-方法3
  • 大模型食材识别技术革新:AI重构精准营养管理
  • 4.6 变体
  • 智能充气泵PCBA方案
  • minio大文件断点续传
  • C语言(嵌入式方向)
  • 【大模型手撕】pytorch实现LayerNorm, RMSNorm
  • 执行计划 RAC 笔记
  • 西嘎嘎学习 - C++ 类 对象 - Day 8
  • 如何把PPT转换成PDF?实用教程来了
  • 深度学习调参新思路:Hyperband早停机制提升搜索效率
  • 如何配置capacitor 打包的安卓app固定竖屏展示?
  • Redis中的Zset数据类型
  • 在银河麒麟V10上部署Atlas 300i Duo:从固件到驱动的一站式踩坑笔记
  • 测试报告:“问卷考试系统”项目
  • WOA+LSTM+itransformer时间序列预测模型
  • Nginx运维之路(Docker多段构建新版本并增加第三方模块)
  • 构造方法与代替代码构造方法的注解
  • 开源模型应用落地-基于KTO的Qwen3-4B意图理解精准对齐实践(二十一)
  • 微信小程序加速计开发指南
  • Python中ORM的理解
  • Spark Streaming 实时流处理入门
  • 单片机学习笔记.C51存储器类型含义及用法
  • PgSQL中pg_stat_user_tables 和 pg_stat_user_objects参数详解
  • Matlab机器人工具箱7 搬运动画展示
  • 概率论第五讲—大数定律与中心极限定理