new 操作符的原理及手写

什么是 new ?

在JavaScript中,new 是一个用于创建对象实例的关键字。它用于调用构造函数,并返回一个新的对象。

使用

  • 使用 new 创建的对象,可以访问构造函数及其原型链上的属性和方法。
js 复制代码
function User(name) {
  this.name = name;
  this.isAdmin = false;
}

let user = new User("Jack");

console.log(user.name); // Jack
user.isAdmin(); // yes
  • 通常,构造器没有 return 语句。它们的任务是将所有必要的东西写入 this,并自动转换为结果。

  • 但是,如果这有一个 return 语句,那么规则就简单了:

    • 如果 return 返回的是一个对象,则返回这个对象,而不是 this
    • 如果 return 返回的是一个原始类型,则忽略。
js 复制代码
function BigUser(name) {

  this.name = name;

  return { name: "Godzilla" };  // <-- 返回这个对象
}

const user = new BigUser("John");
console.log(user.name);  // Godzilla,得到了那个对象
  • 这里有一个 return 为空的例子(或者我们可以在它之后放置一个原始类型,没有什么影响):
js 复制代码
function SmallUser(name) {

  this.name = name;

  return; // <-- 返回 this
}

const user = new SmallUser("John");
console.log(user.name)  // John

实现原理

  1. 创建一个新对象
  2. 新对象的原型指向构造函数的原型对象
  3. 构造函数中的this指向该对象(也就是为这个对象添加属性和方法)
  4. 构造函数返回的是对象则返回它,如果不是则返回一开始创建的新对象

手写 new 操作符

js 复制代码
function myNew(constructor,...args){
    // 创建一个新对象,原型指向构造函数的原型对象
    const obj = Object.create(constructor.prototype);
    // 将构造函数的this指向新对象。如果构造函数没有返回对象时,result为undefined,this指向obj;如果构造函数返回了一个对象,this指向返回的对象
    const result = constructor.apply(obj,args);
    // 如果构造函数返回了一个对象,则返回该对象;否则,返回新对象
    return result instanceof Object ? result : obj; 
}
  • 测试:
js 复制代码
function myNew(constructor,...args){
    // 创建一个新对象,原型指向构造函数的原型对象
    const obj = Object.create(constructor.prototype);
    // 将构造函数的this指向新对象。如果构造函数没有返回对象时,result为undefined,this指向obj;如果构造函数返回了一个对象,this指向返回的对象
    const result = constructor.apply(obj,args);
    // 如果构造函数返回了一个对象,则返回该对象;否则,返回新对象
    return result instanceof Object ? result : obj; 
}


function User(name, age) {
    this.name = name;
    this.age = age;
}

User.prototype.say = function () {
    console.log(this.name)
}

const p = myNew(User, "qqq", 20)
console.log(p) // User {name: 'qqq', age: 20}
p.say() // qqq

如有问题欢迎在评论区讨论,一起进步!

相关推荐
oak隔壁找我20 小时前
JavaScript 的函数方法apply、call和bind
javascript
HashTang20 小时前
【AI 编程实战】第 5 篇:Pinia 状态管理 - 从混乱代码到优雅架构
前端·vue.js·ai编程
青莲84320 小时前
Kotlin Flow 深度探索与实践指南——上部:基础与核心篇
android·前端
Bug生活204820 小时前
五年断更,AI助我半天复活小程序
前端·微信小程序·ai编程
狗头大军之江苏分军20 小时前
Node.js 性能优化实践,但老板只关心是否能跑
前端·后端
恋猫de小郭20 小时前
2025 年终醒悟,AI 让我误以为自己很强,未来程序员的转型之路
android·前端·flutter
用泥种荷花21 小时前
【前端学习AI】PromptTemplate的使用
前端
李拾叁的摸鱼日常21 小时前
Java泛型基本用法与PECS原则详解
java·后端·面试
狗头大军之江苏分军21 小时前
Node.js 真香,但每次部署都想砸电脑
前端·javascript·后端
2501_9462243121 小时前
旅行记录应用关于应用 - Cordova & OpenHarmony 混合开发实战
javascript·harmonyos·harvester