本文深入解析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 操作符,成功模拟了类和类实例化的效果。
总结
总结
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对本站的支持。