详解JavaScript中new()到底做了些什么?

作者:代码拾荒

时间:2026-10-22

浏览:395

本文深入解析JavaScript中new运算符的执行流程,揭示其创建对象、绑定原型及执行构造函数的内部机制。通过对比传统面向对象与伪经典模式,阐明__proto__与prototype在模拟类继承中的作用,帮助开发者理解JS对象模型的核心原理。

文章目录

前言

前言

与其他高级编程语言类似,JavaScript 也提供了 new 运算符。通常认为,new 用于实例化类并在内存中分配一个对象实例。然而,在 JavaScript “万物皆对象”的理念下,为何仍需借助 new 来生成对象?本文将深入探讨 JavaScript 中 new 运算符背后的奥秘。

若要创建 Person 类的新实例,必须使用 new 操作符。

以这种方式调用构造函数时,实际上会经历以下 4 个步骤:

(1)创建一个新对象;

(2)将构造函数的作用域赋予新对象,使 this 指向该新对象;

(3)执行构造函数中的代码,为新对象添加属性;

(4)返回新对象。

new 操作符

new 操作符

在理解上述基础概念后,结合 new 操作符,我们可以实现传统面向对象语言中 class + new 的创建方式。在 JavaScript 中,这种模式被称为伪经典模式(Pseudoclassical)。

基于前述示例,我们执行如下代码:


var obj = new Base();

这段代码的执行结果如何?在 JavaScript 引擎中,观察到的对象模型如下:

前言

new 操作符具体执行了哪些操作?其实主要包含三件事。


var obj = {};
obj.__proto__ = Base.prototype;
Base.call(obj);

第一行代码创建了一个空对象 obj。

第二行代码将该空对象的 __proto__ 成员指向 Base 函数对象的 prototype 成员对象。

第三行代码将 Base 函数对象的 this 指针替换为 obj,随后调用 Base 函数。这使得 obj 对象获得了 id 成员变量,其值为 “base”。此处涉及 call 函数的用法。

如果我们在 Base.prototype 对象上添加一些函数,会产生什么效果?

例如,代码如下:


Base.prototype.toString = function() {
 return this.id;
}

当使用 new 创建新对象时,依据 __proto__ 的特性,toString 方法也可作为新对象的方法被访问。于是我们观察到:

在构造函数中,我们设置“类”的成员变量(如示例中的 id);在构造函数的 prototype 中,我们设置“类”的公共方法。通过函数对象、JavaScript 特有的 __proto__ 与 prototype 成员以及 new 操作符,成功模拟了类和类实例化的效果。

总结

总结

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对本站的支持。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章