new操作符

new操作符做了以下工作

手写new操作符(适用于Class类和Function构造函数)

ts 复制代码
function mynew<Func extends new (...args: any[]) => any>(Func: Func, ...args: any[]): InstanceType<Func> {
  // 使用 Object.create 创建一个新对象,并将它的原型设置为构造函数的 prototype
  const obj = Object.create(Func.prototype);
  
  // 将构造函数的 this 指向这个新对象,并调用构造函数
  const res = Func.apply(obj, args);

  // 如果构造函数返回的是一个对象,则返回该对象;否则返回新创建的对象
  return (typeof res === 'object' && res !== null) ? res : obj;
}

// 示例用法
class MyClass {
  constructor(public name: string) {}
}

const instance = mynew(MyClass, "Alice");
console.log(instance.name); // 输出: Alice
  1. 使用 Object.create()

    • Object.create(Func.prototype) 创建了一个新的空对象,并将其原型设置为 Func.prototype。这等同于手动设置 __proto__ 的效果,但更符合标准和规范。
  2. 泛型类型参数

    • Func extends new (...args: any[]) => any 定义了 Func 是一个构造函数类型,它接受任意数量的参数并返回任意类型的实例。
    • InstanceType 是 TypeScript 中的一个类型操作符,用于从一个构造函数类型中提取其实例类型
    • InstanceType<Func> 表示 Func 构造函数所创建的实例类型,这样可以确保返回值的类型正确性。
  3. 检查返回值

    • typeof res === 'object' && res !== null 检查构造函数返回的 res 是否是一个非空对象。如果是,则返回 res;否则返回新创建的对象 obj
    • 构造函数中返回一个原始值,则该原始值不会被返回,不起作用;若构造函数返回值为对象,则这个返回值会被正常返回。
相关推荐
海上彼尚40 分钟前
Nodejs也能写Agent - 22.LangGraph篇 - 上下文工程
前端·javascript·人工智能·langchain·node.js
阳光是sunny1 小时前
LangGraph实战教程:预定义状态MessagesState与AgentState
前端·人工智能·后端
GuWenyue2 小时前
等AI回复卡顿到劝退?Vue3+DeepSeek流式输出实战,70行代码实现打字机效果
前端·人工智能·客户端
Jackson__2 小时前
AI Agent 的能力从哪里来?一文讲清后训练、上下文学习和外部能力
前端·agent·ai编程
默_笙2 小时前
🎉 AI 项目里为什么需要 BFF?因为我实在不想在前端处理二进制流
前端·javascript
Revolution612 小时前
改一个订单筛选,为什么要在六个目录里来回找,前端项目目录到底要怎么拆
前端·前端工程化
阳光是sunny2 小时前
LangGraph高级教程:Multi Schema多状态管理详解
前端·人工智能·后端
mCell3 小时前
从 TodoList 到 Microsoft To Do:全栈工程师到底要管什么?
前端·编程语言·全栈
阳光是sunny3 小时前
LangGraph实战教程:状态管理与`graph.invoke`入参深度解析
前端·人工智能·后端