当前位置: 首页 > news >正文

推理实现new操作符

JavaScript new操作符实现

  • 要去设计一个东西,首先要想好你想如何使用它,其次是考虑他的功能。

想如何使用

const zs = myNew(User, 'zs', 18)

很简单,传一个构造函数给我,我返回你一个实例对象,这就是 new 最直接的功能

构造函数(不必多说)

	function User(name, age) {this.name = namethis.age = age}User.prototype.show = function () {console.log(this.name, this.age)}

接下来要做的就是思考如何实现 myNew 的功能了

思考
1、myNew 有什么样的功能,其实是你想得到一个什么样的 zs决定的

  • zs本质就是一个对象,所以可以写出如下代码
	function myNew(Constructor, ...args) {const instanceObj = {}return instanceObj}

2、通过第一步已经确定主干了,接下来思考 zs实例对象和User构造函数之间的关系

  • 在使用 js 的 new 操作符时,实例对象的 __proto__ 会指向构造函数的 prototype,也就是我们要满足以下这种关系
	zs.__proto__ === User.prototype //true
  • 有了上面的分析,很容易写出以下代码,就是一个赋值操作
    instanceObj.__proto__ = Constructor.prototype
  • 接下来,我们需要把参数传给构造函数,让其将参数保存在 this 上,我们通过实例对象去访问的时候能够访问到
	Constructor(...args)

如果用以上方式传参的话,构造函数内部的 this 在浏览器环境中会指向 window,所以我们需要改变其内部的 this 指向

	Constructor.apply(instanceObj, args)

完整代码

        function User(name, age) {this.name = namethis.age = age}User.prototype.show = function () {console.log(this.name, this.age)}function myNew(Constructor, ...args) {const instanceObj = {}instanceObj.__proto__ = Constructor.prototypeConstructor.apply(instanceObj, args)return instanceObj}const zs = myNew(User, 'zs', 18)zs.show()

http://www.mrgr.cn/news/47002.html

相关文章:

  • 关于编写测试用例的细枝末节
  • qt QPainter setViewport setWindow viewport window
  • 网络协议(八):IP 协议
  • 金融项目实战 01|功能测试分析与设计
  • ThreeJs练习——载入外部模型
  • 【Linux】Linux基础命令(二)
  • AI绘画Stable Diffusion XL优化终极指南!
  • CSS 命名规范及 BEM 在前端开发中的实践
  • 《网络基础之 HTML 与 CSS 基础 —— 网页的基本结构解析》
  • 力扣1~10题
  • acme.sh在nginx环境配置,ssl证书测试
  • HCIE的含金量都是被吹出来的?
  • 洗衣店订单管理:Spring Boot技术革新
  • [实用工具]Docker安装nextcloud实现私有云服务和onlyoffice
  • 【工具】前端js数字金额转中文大写金额
  • JAVA中的线程控制
  • 画质修复怎么弄?这4个恢复照片清晰度的修复工具快收藏
  • vue3学习记录-watch
  • 智慧水利(数字孪生流域)建设方案
  • 从不同的细节察觉人的性格
  • A股热了,但黄金周实体经济的统计数字却有点凉
  • 地理空间数据共享资源,爱好者进
  • PELCO-D协议简介
  • python 实现双向A*算法
  • vue3实现登录获取token并自动刷新token进行JWT认证
  • 面试指南1009