剑、鞘、剑法三合一:this+new+构造函数的绑定奥义
ZZZ复盘学习JS基础,重新认识知识,总结掌握知识,炼化知识,输出知识。这是一篇学习反思,用自己的逻辑把知识体系搭建,用自己的话总结输出。
秘法包指南和答疑(读完再学直接开爽)
插个题外话:大家看到这个标题可能会感觉很中二,甚至很二。觉得一个学习心得分享搞得好像不太正常之类。我希望分享自己的看法和学习的心路历程,无论什么形式只要能学习到知识搭建自己的体系,目的就达到了。
回到正文,看到这三个东西this,new,构造函数,面向对象瞬间就有点头大了。在学习的过程中,我更是疑问连连,为什么我刚学this,又突然冒出来个new,还成了绑定的老搭档?突然说一个面对对象到底是干啥的?是谁的对象?再一个就是看别人写的代码,感觉阅读都困难是不是我太笨了不适合学?导致泄气,学习痛苦,感觉艰难万分。
因为有这些疑惑和痛苦,所以我做了一个秘法包底层逻辑解析。如下
三者的诞生初心:为面向对象而生
先简单了解面向对象:面向对象,就是把数据和操作打包成对象,用对象来组织代码、实现复用与维护的编程思想。
面向对象,就是把需求抽象成一个专属对象,再为它定制一套属性与方法的「专属秘法」。
下面学习的this,new,构造函数就是秘法包让你创造专属秘法用的
- this :为面向对象而生的核心指针
JS设计 this 的唯一核心目的,就是让对象的方法能够精准指向自身实例。在面向对象中,我们需要让同一个构造函数创建的多个实例,各自调用自己的属性和方法, this 就是实现这一需求的底层工具——它天生就是为了在对象内部指代当前实例,让对象的行为与自身数据绑定,是面向对象编程的“灵魂载体”。
- new :为规范 this 而生的绑定工具
既然 this 的核心是指向实例,那如何确保 this 在构造函数调用时,精准绑定到新创建的实例上?这就是 new 诞生的意义。 new 的本质,就是一套强制绑定 this 指向的执行流程:它会自动创建空对象、将 this 绑定到该对象、执行构造函数、返回实例,彻底解决了 this 指向混乱的问题,是 this 在面向对象中正常工作的“安全保障”。
- 构造函数:为创建对象而生的模板
面向对象的核心是“对象”,而构造函数就是批量创建同类型对象的标准化模板。它的诞生目的,就是把对象的属性、方法统一封装,通过 new 调用,快速生成结构一致、行为统一的实例,是连接 this 和 new 、实现面向对象复用性的核心载体。
三者的强绑定关系:缺一不可的闭环(仅仅是指闭环中强绑定详情看后面补充)
三者从诞生起就形成了不可分割的闭环逻辑,少任何一个,面向对象的核心机制都会彻底失效:
- 没有 this :构造函数无法给实例赋值, new 创建的对象没有可操作的属性和方法,面向对象失去了“操作对象”的能力;
- 没有 new :构造函数调用时 this 会指向全局,无法绑定到新实例, this 失去了明确归属,面向对象失去了“创建对象”的规范;
- 没有构造函数: this 和 new 失去了用武之地,没有模板就无法批量创建对象,面向对象失去了“复用对象”的基础。
补充说明:三者强绑定 ≠ 离开彼此就完全不能用
前面说 this 、 new 、构造函数强绑定、缺一不可、形成闭环, 这句话的准确含义是:
它们三者绑定在一起,才构成 JavaScript 面向对象的标准、完整、最常用的写法。 这是我们日常开发、写 class、做工程化最核心、最推荐、最规范的模式。
但这不代表:
- this 离开 new 就不能用
- new 离开构造函数就不能用
- 构造函数不被 new 调用就报错
它们各自是独立语法,只是:
- 单独用 this → 指向容易乱
- 单独用构造函数 → 变成普通函数
- 单独用 new + 普通函数 → 也能创建对象,但不规范
只有三者配合,才是标准面向对象写法,才是稳定、安全、工程化的最佳实践。
简单一句话总结: 它们不是不能分开,只是分开用不规范、不安全、不面向对象。 三者绑定,才是 JS 设计者真正想让我们用的「正统用法」。
**看了这么多概念想必还是有点啰嗦,下面我把概念用最通俗的抽象总结:
-
this 是剑:是操作对象的武器,天生为面向对象服务;
-
new 是剑鞘:是规范剑的归属、保障剑安全使用的配套工具,天生为 this 服务;
-
构造函数是剑法:是教你如何用剑、如何通过剑鞘打造武器的招式,天生为创建对象服务;
-
三者合一,才构成了完整的面向对象武学体系,是JS面向对象编程的底层核心。
回过头来再看,他们三个就没有那么可怕那么难懂了
*1. 学会使用最锋利的剑:this:详解 this 的本质、指向规则、核心用法
*2. 给剑配上专属剑鞘:new:详解 new 的执行过程、与 this 的绑定逻辑
*3. 创造专属剑法:构造函数:详解如何设计构造函数、封装对象属性与方法
这样再来看前面的“看不懂代码是不是我很笨?”这个问题 就会觉得恍然大悟,可能只是每个人“修炼的剑诀”不一样,或是他修炼的时间比我长我的剑法造诣不如他有一些剑法我都见过。这么来看,我也未必是笨,闻道有先后罢了。
最后的抽象才是秘法包的精髓
结尾
虽然这篇文章没有深入讲解具体的语法细节和代码实战,但我已经把 JS 面向对象最核心的根基—— this 、 new 和构造函数的本质、作用、诞生目的以及三者之间的强绑定关系,用一套抽象逻辑彻底理解通透了。
就这套底层认知,不仅帮我搞懂了为什么要学这三个东西、它们为什么必须一起出现,也为我接下来继续学习原型、原型链、继承以及 ES6 class 语法糖,打下了最扎实、最稳固的基础。只要根基通了,后面再学任何面向对象的知识,都会变得顺理成章、一通百通。
如果有理解不对的地方,欢迎大家指正,一起学习进步