说白点,就算不看官方文档,我们根据上面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
==========================================================================
function myNew(){
//前面四步都不变
const obj = new Object()
const restArg = [].shift.call(arguments, 1)
obj.proto = restArg.prototype;
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
提升的资深开发者,这些资料都将为你打开新的学习之门!**
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!