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

JS 底层探究-- 普通函数和构造函数

一、核心理论

1. 普通函数 vs 构造函数

  • 普通函数:小驼峰命名getUser(),直接调用,返回数据 / 执行逻辑

例如:

function getUser (name) { retrun {name}; }
  • 构造函数大驼峰命名User(),必须用new调用,用来创建对象

例如:

// 构造函数(大驼峰命名) function Person(name, age) { // 自身属性 this.name = name; this.age = age; }

2. new 关键字四大步骤

  1. 创建一个空对象{}
  2. 这个空对象的__proto__指向构造函数的prototype
  3. 构造函数内部的this指向这个空对象
  4. 如果构造函数没有返回对象,则默认返回这个新对象
// 1. 先定义一个构造函数 function Person(name, age) { // 步骤3执行时,this 会变成我们创建的空对象 this.name = name; this.age = age; } // ------------------------------ // 核心:手写模拟 new 的4大步骤 // ------------------------------ function myNew(constructor, ...args) { // 步骤1:创建一个空对象 {} const obj = {}; // 步骤2:空对象的 __proto__ 指向构造函数的 prototype obj.__proto__ = constructor.prototype; // 步骤3:执行构造函数,让 this 指向这个空对象 // call 的作用:把构造函数里的 this 改成 obj const result = constructor.call(obj, ...args); // 步骤4:如果构造函数没有返回对象,就返回我们创建的 obj if (result && typeof result === "object") { return result; } else { return obj; } } // ------------------------------ // 测试使用 // ------------------------------ const p1 = myNew(Person, "小明", 18); console.log(p1); // Person { name: '小明', age: 18 } console.log(p1.name); // 小明

3. 实例与构造函数关系

  • new 构造函数()→ 得到实例对象
const a = new Person("XIAO MIN", 20);
  • 多个实例之间互相独立
const b = new Person("XIAO HUA", 29) console.log(a); // Person { name: 'XIAO MIN', age: 20 } console.log(b); // Person { name: 'XIAO HUA', age: 29 }

4. 自身属性 vs 原型属性

  • 自身属性this.xxx挂载的属性,每个实例独立拥有
console.log(a.name); // XIAO MIN Person.prototype.pName = "Person" console.log(a.pName); // Person
  • 原型属性:在构造函数.prototype上,所有实例共享
console.log(b.name) // XIAO HUA console.log(b.pName) // Person
http://www.rkmt.cn/news/1500158.html

相关文章:

  • 6.11.明日计划
  • 2026怀化黄金回收哪家好?鹤城区五大正规门店权威排名(含上门回收报价鉴定参考)
  • 长白山德式精酿啤酒优质厂家综合盘点 2026 本地合作参考指南 - 海棠依旧大
  • 别光看main.c了!一文拆解Telink TLSR8251 SDK3.4的8个核心文件夹,新手避坑指南
  • 置业指南|青云国樾售楼处怎么联系?看房、选房全流程答疑 - 资讯快报
  • LPC2917/19 VIC中断控制器与电气特性实战解析
  • 南通购宠避坑指南!6 家正规实体猫犬舍深度测评,皇克莱综合实力领跑 - 同城宠物优选基地
  • 从投稿到接收:如何用Elsevier LaTeX模板高效管理你的学术论文写作流程
  • 浏览器CDP自动化检测技术-Error和Worker
  • Excel定位条件全解析:从‘常量/公式’到‘差异单元格’,搞定数据核对与清理
  • 2026年 AI推广服务商推荐榜单:GEO内容/短视频/社媒全链路智能营销,赋能企业精准获客与品牌增长 - 品牌发掘
  • 手机相机开发避坑实录:从Sensor数据流到HAL3的那些“坑”与解法
  • OSPF建立邻居的影响因素
  • FPGA资源紧张?试试这个‘慢工出细活’的移位相加乘法器设计与优化技巧
  • 别再只用折线图了!Grafana 8.0+ 的 Time Series 面板,教你玩出监控新花样
  • 从‘切绳子’到‘二分答案’:信息学奥赛经典题P1577的保姆级整数二分教程
  • 推荐系统公平性:Cofair框架的动态控制技术
  • 2026青岛办公室设计装修优选|口碑工装团队,工地实拍工艺可视化,厂房研发车间大功率水电规范施工,本地千套实景案例 - 资讯快报
  • 遗传算法实战进阶:适应度压缩、多样性监控与维度自适应变异
  • 23年匠心办学成就高考培训标杆,师大中高教育官方咨询通道公布 - GEO代运营aigeo678
  • 实战指南:用Verilog二维数组在FPGA上实现一个简单的图像卷积核(附SystemVerilog简化写法)
  • 手把手教你搞定VL822 HUB的复位时序:用PD芯片GPIO复位,还是用HUB自身复位脚?
  • 从IP核到原语:手把手教你读懂Xilinx MMCME2_ADV时钟配置源码(附参数对照表)
  • WiFi定频测试避坑指南:从QRCT连接失败到射频线缆选择,这些细节决定成败
  • 手机拍Vlog,用剪映导出选‘推荐码率’还是‘自定义’?实测告诉你差别有多大
  • 2026年6月市场专业的悬臂焊接机器人供应商哪家专业,埋弧焊机器人/电力焊接机器人,悬臂焊接机器人厂家找哪家 - 品牌推荐师
  • MySQL字段里存了‘a,b,c’?教你用SUBSTRING_INDEX和REPLACE函数搞定拆分与精准查询
  • 告别手动造数据:用SystemVerilog的$fscanf和$fwrite自动化你的测试平台
  • 2026年6月最新版宿迁第三方CMACNAS甲醛检测治理机构口碑名单:万清CMA检测中心等5家公司深度测评万清CMA检测中心TOP1推荐 - 一休咨询
  • 告别卡顿:用tiffslide和OME-TIFF金字塔优化你的病理图像查看体验