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
    • 构造函数中返回一个原始值,则该原始值不会被返回,不起作用;若构造函数返回值为对象,则这个返回值会被正常返回。
相关推荐
路修远i4 分钟前
前端单元测试
前端·单元测试
明川12 分钟前
Android Gradle学习 - Gradle插件开发与发布指南
android·前端·gradle
不一样的少年_15 分钟前
【用户行为监控】别只做工具人了!手把手带你写一个前端埋点统计 SDK
前端·javascript·监控
Cache技术分享19 分钟前
270. Java Stream API - 从“怎么做”转向“要什么结果”:声明式编程的优势
前端·后端
king王一帅26 分钟前
AI 时代真正流式解析+渲染双重优化的 Incremark
前端·ai编程·markdown
Glommer30 分钟前
AST 反混淆处理示例(二)
javascript·爬虫
aesthetician42 分钟前
用铜钟听歌,发 SCI !
前端·人工智能·音频
Mike_jia1 小时前
LogWhisperer 全解析:打造你的Linux服务器AI日志分析中枢
前端
网安Ruler1 小时前
崭新出厂,自研CipherForge小工具,攻破 D-Link M30 固件加密
前端·网络·python
daxiang120922051 小时前
记一次前端请求报错:Content-Length can‘t be present with Transfer-Encoding,+Cursor使用教训
前端·cursor