JS 底层探究之普通函数和构造函数详解

 更新时间:2026年06月10日 09:49:57   作者:半个烧饼不加肉  
这段文章详细解析了JavaScript中的构造函数与普通函数的区别,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

一、核心理论

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

到此这篇关于JS 底层探究之普通函数和构造函数详解的文章就介绍到这了,更多相关js普通函数和构造函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JavaScript数组去重的几种方法详谈

    JavaScript数组去重的几种方法详谈

    这篇文章给大家总结下JavaScript数组去重的几种方法,面试中也经常会遇到这个问题。文中给大家引申的还有合并数组并去重的方法,感兴趣的朋友跟随脚本之家小编一起学习吧
    2021-10-10
  • 详解webpack import()动态加载模块踩坑

    详解webpack import()动态加载模块踩坑

    这篇文章主要介绍了详解webpack import()动态加载模块踩坑,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • 浅析script标签中的defer与async属性

    浅析script标签中的defer与async属性

    最近在网上看到一个前辈在写script标签的时候,居然同时写了async和defer属性,想着这是什么意思呢?所以决定深入的了解下这其中的学问,以下这篇文章就是个人在学习了之后的一些总结分析,有需要的朋友们可以参考借鉴,下面来一起学习学习吧。
    2016-11-11
  • 基于 Bootstrap Datetimepicker 联动

    基于 Bootstrap Datetimepicker 联动

    这篇文章主要介绍了基于bootstrap datetimepicker 联动效果,需要的朋友可以参考下
    2017-08-08
  • 微信小程序实现刷脸登录

    微信小程序实现刷脸登录

    这篇文章主要为大家详细介绍了微信小程序实现刷脸登录,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • 详解JavaScript实现哈希表

    详解JavaScript实现哈希表

    哈希表是一种非常重要的数据结构,几乎所有的编程语言都有直接或者间接的应用这种数据结构。本文将为大家介绍通过JavaScript如何实现哈希表,以及哈希表的一些常用操作,需要的可以参考一下
    2021-12-12
  • JavaScript setTimeout使用闭包功能实现定时打印数值

    JavaScript setTimeout使用闭包功能实现定时打印数值

    这篇文章主要介绍了JavaScript setTimeout使用闭包功能实现定时打印数值 的相关资料,需要的朋友可以参考下
    2015-12-12
  • 基于Bootstrap的后台管理面板 Bootstrap Metro Dashboard

    基于Bootstrap的后台管理面板 Bootstrap Metro Dashboard

    这篇文章主要介绍了基于Bootstrap的后台管理面板:Bootstrap Metro Dashboard,对Bootstrap的后台管理面板感兴趣的小伙伴们可以参考一下
    2016-06-06
  • js将当前时间格式转换成时间搓(自写)

    js将当前时间格式转换成时间搓(自写)

    将时间转换成时间搓的方法有很多,在本文为大家介绍下使用js将当前时间转换成时间搓 例如2013-09-11 12:12:12,感兴趣的朋友可以参考下
    2013-09-09
  • Js数组的操作push,pop,shift,unshift等方法详细介绍

    Js数组的操作push,pop,shift,unshift等方法详细介绍

    js中针对数组操作的方法还是比较多的,今天突然想到来总结一下,也算是温故而知新吧。不过不会针对每个方法进行讲解,我只是选择其中的一些来讲,感兴趣的朋友可以研究一下
    2012-12-12

最新评论