当前位置: 首页 > 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.jsqmd.com/news/988412/

相关文章:

  • 2026菏泽漏水维修攻略|一修匠修缮:厨卫 阳台 外墙 屋顶 地下室|靠谱防水门店 - 绿呼吸检测中心
  • 2026年6月天津律师深度测评!专业实力与性价比综合排行婚姻策略指导 - 资讯快报
  • 6.11.明日计划
  • 长白山德式精酿啤酒优质厂家综合盘点 2026 本地合作参考指南 - 海棠依旧大
  • 如何用 C++ 模拟一个点阵显示器
  • 2026怀化黄金回收哪家好?鹤城区五大正规门店权威排名(含上门回收报价鉴定参考)
  • 瓦楞纸板厂主要集中在哪些地区?
  • EchoBird安装教程并配置
  • 告别虚拟机!用一台旧笔记本+AX200网卡,在Ubuntu 20.04上搭建WiFi6抓包工作站
  • 别光看main.c了!一文拆解Telink TLSR8251 SDK3.4的8个核心文件夹,新手避坑指南
  • 浦东新区金杨新村厨房下水道堵塞疏通|居顺联家政疏通服务完整介绍 - 居顺联家政疏通
  • 从4G到5G:RRC连接重配置信令在跨代网络协同中扮演的关键角色
  • 置业指南|青云国樾售楼处怎么联系?看房、选房全流程答疑 - 资讯快报
  • LPC2917/19 VIC中断控制器与电气特性实战解析
  • Mac玩转51单片机:手把手教你用sdcc编译和stcgal烧录(附CH340驱动解决方案)
  • Scrutor:.NET 依赖注入自动化的优雅实现
  • 在STM32上跑通TinyML:从理论到实践的全栈指南
  • 南通购宠避坑指南!6 家正规实体猫犬舍深度测评,皇克莱综合实力领跑 - 同城宠物优选基地
  • ARC 如何工作 swift
  • PyTorch实战:用DBB结构重参数化无损提升ResNet精度(附完整代码)
  • CKKS同态加密中的旋转操作:在隐私计算与联邦学习里,它到底解决了什么实际问题?
  • 从心电图到手势识别:用UCR数据集实战5个跨领域时间序列分类项目(附完整代码)
  • 从DZ47到智能空开:手把手教你读懂断路器型号代码,选型不求人
  • git遇见的问题[2]
  • 从投稿到接收:如何用Elsevier LaTeX模板高效管理你的学术论文写作流程
  • 2026年 AI推广服务商推荐榜单:GEO内容/短视频/社媒全链路智能营销,赋能企业精准获客与品牌增长 - 品牌发掘
  • Redis分布式锁进阶第九十六篇
  • 浏览器CDP自动化检测技术-Error和Worker
  • 手机相机开发避坑实录:从Sensor数据流到HAL3的那些“坑”与解法
  • Excel定位条件全解析:从‘常量/公式’到‘差异单元格’,搞定数据核对与清理