面试常考 | 深入理解 JavaScript 中手写 new 操作符

在 JavaScript 里,new 操作符是创建对象实例的常用方式。不过,你是否好奇它内部是如何工作的呢?这篇文章会详细剖析 new 操作符的原理,还会手把手教你手写一个 new 函数。

什么是 new 操作符

在 JavaScript 中,new 操作符的用途是创建一个用户自定义对象类型的实例,或者创建一个内置对象类型的实例。咱们先看一个简单的例子:

ini 复制代码
function Person(name, age) {
    this.name = name;
    this.age = age;
}
Person.prototype.sayName = function() {
    console.log(`My name is ${this.name}`);
};
const john = new Person('John', 30);
john.sayName(); 

在这个例子中,new Person('John', 30) 创建了一个 Person 构造函数的实例 john。new 操作符完成了以下几个关键步骤:

  1. 创建新对象:一个全新的对象被创建出来。
  1. 设置原型:新对象的原型会被设置为构造函数的 prototype 属性。
  1. 执行构造函数:构造函数会在新对象的上下文中执行,也就是说,构造函数里的 this 会指向新对象。
  1. 返回新对象:如果构造函数没有显式返回一个对象,那么就返回新创建的对象。

手写 new 函数

接下来,我们要自己实现一个 new 函数,以此来深入理解 new 操作符的工作原理。以下是实现代码:

javascript 复制代码
function objectFactory() {
    console.log(arguments,arguments.length);
    const obj = new Object();
    //arguments 类数组对象,没有shift方法 
    // 1.将类数组对象转化为数组对象
    // 2.数组对象调用shift方法
    // 3.将shift方法返回的结果赋值给Constructor
    // 4.删除数组对象的第一个元素
    const Constructor = [].shift.call(arguments);
    console.log(Constructor);
    obj.__proto__ = Constructor.prototype;
    Constructor.apply(obj, arguments);
    console.log(obj);
    return obj;
}

代码解释

  1. 创建新对象
ini 复制代码
const obj = new Object();

这行代码创建了一个全新的空对象。

  1. 获取构造函数
ini 复制代码
const Constructor = [].shift.call(arguments);

arguments 是一个类数组对象,它包含了传递给 objectFactory 函数的所有参数。我们借助 [].shift.call(arguments) 把 arguments 的第一个元素取出来,这个元素就是构造函数。

  1. 设置原型
ini 复制代码
obj.__proto__ = Constructor.prototype;

这行代码把新对象 obj 的原型设置为构造函数的 prototype 属性,这样新对象就可以继承构造函数原型上的属性和方法了。

  1. 执行构造函数
arduino 复制代码
Constructor.apply(obj, arguments);

使用 apply 方法在新对象 obj 的上下文中执行构造函数,这样构造函数里的 this 就会指向新对象。

  1. 返回新对象
kotlin 复制代码
return obj;

最后,返回新创建的对象。

使用自定义的 new 函数

ini 复制代码
let shuai = objectFactory(Person, "小帅", 20);
console.log(shuai.name);
shuai.sayName();

在这个例子中,我们用 objectFactory 函数创建了一个 Person 构造函数的实例 shuai。可以看到,shuai 对象拥有 name 属性,并且能调用 sayName 方法。

总结

通过手写 new 函数,我们对 new 操作符的工作原理有了更深入的理解。new 操作符本质上就是创建一个新对象,设置其原型,执行构造函数,最后返回新对象。掌握这个原理,有助于你更好地理解 JavaScript 中的面向对象编程。

希望这篇文章能帮助你理解 JavaScript 中 new 操作符的原理和实现方式。如果你有任何疑问或者建议,欢迎在评论区留言。

相关推荐
用户14567756103722 分钟前
文件太大传不了?用它一压,秒变合格尺寸!
前端
用户14567756103722 分钟前
再也不用一张张处理了!批量压缩神器来了,快收藏
前端
心.c38 分钟前
一套完整的前端“白屏”问题分析与解决方案(性能优化)
前端·javascript·性能优化·html
序属秋秋秋38 分钟前
《C++进阶之C++11》【智能指针】(上)
c++·笔记·学习·面试·c++11·智能指针·新特性
white-persist43 分钟前
【burp手机真机抓包】Burp Suite 在真机(Android and IOS)抓包手机APP + 微信小程序详细教程
android·前端·ios·智能手机·微信小程序·小程序·原型模式
俺会hello我的1 小时前
舒尔特方格开源
前端·javascript·开源
lbh1 小时前
Chrome DevTools 详解(二):Console 面板
前端·javascript·浏览器
ObjectX前端实验室1 小时前
【react18原理探究实践】更新阶段 Render 与 Diff 算法详解
前端·react.js
wxr06161 小时前
部署Spring Boot项目+mysql并允许前端本地访问的步骤
前端·javascript·vue.js·阿里云·vue3·springboot
万邦科技Lafite2 小时前
如何对接API接口?需要用到哪些软件工具?
java·前端·python·api·开放api·电商开放平台