新闻中心

JS中如何模拟实现new操作符_j*ascript核心

2025-11-02
浏览次数:
返回列表
new操作符创建对象时会连接原型、绑定this并返回实例;通过myNew函数可模拟该过程:创建空对象并继承构造函数原型,调用构造函数并将this指向新对象,若返回值为对象则返回该值,否则返回新对象。

js中如何模拟实现new操作符_javascript核心

在J*aScript中,new 操作符用于创建一个用户自定义对象类型的实例或具有构造函数的内置对象类型的实例。理解并模拟实现 new 操作符,有助于深入掌握 J*aScript 的面向对象机制和原型链原理。

new 操作符到底做了什么?

当我们使用 new Constructor() 时,J*aScript 引擎内部会执行以下步骤:

  • 创建一个全新的空对象;
  • 将这个新对象的隐式原型(__proto__)指向构造函数的 prototype 属性;
  • 将构造函数中的 this 绑定到这个新对象上,并执行构造函数体内的代码;
  • 如果构造函数返回了一个非原始类型(即对象或函数),则返回这个返回值;否则返回新创建的对象。

手动模拟实现 myNew 函数

基于上述行为,我们可以写一个函数 myNew 来模拟 new 的效果:

function myNew(Constructor, ...args) { // 1. 创建一个空对象,继承构造函数的 prototype const obj = Object.create(Constructor.prototype); // 2. 调用构造函数,this 指向新对象 const result = Constructor.apply(obj, args); // 3. 如果构造函数返回对象,则使用该返回值,否则返回新对象 return result instanceof Object ? result : obj; }

测试我们的模拟实现

来看一个实际例子:

OneStory OneStory

OneStory 是一款创新的AI故事生成助手,用AI快速生成连续性、一致性的角色和故事。

OneStory 319 查看详情 OneStory function Person(name, age) { this.name = name; this.age = age; } Person.prototype.sayHello = function() { console.log(`Hello, I'm ${this.name}`); }; // 使用原生 new const p1 = new Person("Alice", 25); p1.sayHello(); // 输出: Hello, I'm Alice // 使用我们实现的 myNew const p2 = myNew(Person, "Bob", 30); p2.sayHello(); // 输出: Hello, I'm Bob console.log(p1 instanceof Person); // true console.log(p2 instanceof Person); // true

可以看到,p2p1 表现一致,说明我们的模拟基本成功。

处理构造函数返回对象的情况

有些构造函数可能会显式返回一个对象,这时候 new 应该忽略之前创建的实例。例如:

function Special() { this.value = 'ignored'; return { custom: 'object' }; } console.log(new Special()); // { custom: 'object' } console.log(myNew(Special)); // 同样输出 { custom: 'object' }

这验证了我们在 myNew 中对返回值的判断是必要的。

基本上就这些。不复杂但容易忽略细节。

以上就是JS中如何模拟实现new操作符_j*ascript核心的详细内容,更多请关注其它相关文章!


# 模拟实现  # new操作符  # 返回值  # 面向对象  # 创建一个  # red  # app  # js  # java  # javascript  # 眉山网站整站优化服务  # 市北网站快速优化  # 富阳区公众号营销推广  # 如何使用  # 企业网站优化哪家好公司  # 关于茶叶的营销推广文案  # 微信品牌营销推广方案  # 相关文章  # 我们可以  # 有哪些  # 绑定  # 表单  # 数据结构  # 江西网站推广平台官网  # 北京seo优化及推广  # 夏季袜子关键词搜索排名  # 优化网站要做404吗 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 邮政快递单号查询入口 邮政快递物流信息在线查询入口  uc浏览器网页版入口 uc浏览器网页版最新网址  解决移动端滚动问题的overflow属性应用指南  《铁拳8》黑皮辣妹新实机:元气满满的18岁少女!  UC浏览器网页版登录入口官网 电脑版网址入口  XML中包含HTML标签导致解析错误? 正确嵌入非XML数据的两种方法  sublime如何配置Go语言开发环境_sublime搭建Golang编译运行系统  文本文档写html代码怎么运行_文本文档html代码运行步骤【教程】  J*a递归快速排序中静态变量导致数据累积问题的解决方案  QQ邮箱网页版入口页面 QQ邮箱在线登录入口官网  微信客户端如何收红包_微信客户端接收红包使用教程  C++ explicit关键字防止隐式转换_C++构造函数安全规范  一加 14R 快充无反应_一加 14R 充电优化  可靠CSGO开箱平台解析 CSGO开箱网合集  谷歌google账号注册详细步骤 谷歌账号注册官方教程  韩小圈电脑版在线入口_网页版免费登录地址  sublime如何配置Python开发环境_将sublime打造成轻量级Python IDE  PHP高效扁平化嵌套数组:使用array_merge与数组解包操作符  mysql密码锁定怎么解锁_mysql密码锁定解锁后修改密码步骤  KFC游戏互动怎么赢取优惠券_KFC线上游戏活动参与与优惠代码赢取教程  曝R星经典之作开发图 设计简陋但信息密集!  KFC早餐时段怎么领特惠代码_KFC早餐订餐优惠代码获取与使用说明  192.168.1.1管理中心入口 192.168.1.1路由器网页设置平台  Lar*el如何生成PDF或Excel文件_Lar*el文档导出工具与使用教程  深入理解J*aScript Promise异步执行与微任务队列  解决macOS Tkinter应用双击启动崩溃:PyInstaller打包指南  离线运行Go语言之旅:本地部署与GOPATH配置指南  如何使用 Excel 发布器与 Power BI 分享 Excel 洞察  抓大鹅无需下载版 抓大鹅秒玩版入口  Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践  实现全屏滚动与导航点:专业教程  如何在Promise链中有效终止错误处理后的执行  Python多版本共存与虚拟环境管理深度指南  J*aScript生成器_j*ascript异步迭代  抖音网页版怎么|直播|_抖音网页版开播操作指南  html两个JS只运行一个怎么办_让双JS在html中都运行方法【技巧】  蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接  谷歌邮箱注册显示错误Gmail服务器异常与延迟处理  在J*a中如何开发简易博客标签推荐系统_博客标签推荐项目实战解析  Go语言中Map值调用指针接收器方法的限制与应对  QQ邮箱登录平台入口 QQ邮箱网页版邮箱官方入口  优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题  QQ邮箱在线使用入口 QQ邮箱个人账号网页版登录  AO3最新官网入口公告_2025AO3镜像站实时查询方法  支付宝解绑银行卡步骤_支付宝如何解除绑定银行卡  AO3官网镜像链接 Archive of Our Own同人文在线浏览  AngularJS $http POST请求数据传递与Go后端接收实践  知音漫客官网漫画下载_知音漫客网页版阅读记录  深入理解rpy2中的类型转换:优化Python对象到R矩阵的映射  Win10自动更新怎么关闭 Win10永久关闭系统更新的两种方法【终极版】 

搜索