模拟实现JS中new操作符的工作原理

说白点,就算不看官方文档,我们根据上面new实现的代码,也可以发现:

  • new一个函数会返回一个实例对象

  • 在执行构造函数的过程中,会给返回的实例对象自身添加一些属性

  • 并且实例对象还会继承构造函数原型上的一些属性和方法

模拟实现new工作原理

==========================================================================

既然我们知道了new的工作流程,那我们就自己学一个函数来模拟new的工作原理:

function myNew(){

//第一步:创建一个空对象

const obj = new Object()

//第二步:相当于 const restArgs = arguments.shift(1)

//shift()修改原数组,把数组的第一个元素从其中删除,并返回第一个元素的值。

//restArg就是构造函数(Constructor),arguments就是删除第一个构造函数外的参数集合

const restArg = [].shift.call(arguments, 1)

//第三步:obj继承构造函数原型上的属性和方法

obj.proto = restArg.prototype;

//第四步:obj继承构造函数的属性和方法

restArg.apply(obj, arguments)

//第五步:返回对象

return obj

}

myNew()最后返回的对象既可以访问到构造函数里的属性,又可以访问到构造函数原型中的属性 ,基本实现了new功能;

下面我们就来验证一下:

var XH1 = new myNew(Person,‘小红’,‘20’)

console.log(‘myNew–’,XH1.name) // myNew-- 小红

console.log(‘myNew–’,XH1.age) // myNew-- 20

console.log(‘myNew–’,XH1.hobbit) // myNew-- 听音乐

下面是代码实现图片:(有图有真相)

在这里插入图片描述

构造函数有返回值

=======================================================================

上面为什么说基本实现了,其实new还有一个特性:

  • 如果构造函数又返回值,返回一个对象时,在实例 对象中只能访问返回的对象中的属性。

  • 返回一个基本类型的值时,等于是没有返回,new 实例正常访问属性

代码如下:

function Person(name,age){

this.name = name

return {

age:20

}

}

var XH = new Person('小红)

console.log(XH.name); // undefined

console.log(XH.age); // 20

console.log(XH.proto === Object.prototype); // true

console.log(XH.proto === Person.prototype); // false

new模拟实现的最终版

==========================================================================

function myNew(){

//前面四步都不变

const obj = new Object()

const restArg = [].shift.call(arguments, 1)

obj.proto = restArg.prototype;

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
提升的资深开发者,这些资料都将为你打开新的学习之门!**

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值