当前位置: 首页 > 后端技术 > Node.js

new、call、apply、bind方法的实现原理

时间:2023-04-03 15:34:37 Node.js

javascriptnew、call、apply、bind等方法我们经常用到,在伪数组转数组、函数传参、继承等场景,都离不开打开它们。这里我们不具体讨论它们的使用方法,我们会研究它们的实现方法,重写自己的方法,让大家重新认识它们的实现过程,让大家知道它们是什么,为什么开发!new的实现我们使用new来实例化一个构造函数来生成一个实例对象,new是做什么的,主要分为以下五个步骤:1:获取构造函数2:创建一个新对象;3:使用函数的功能域赋给一个新的对象(这里其实是一个新的上下文)4:执行函数中的代码(给新对象添加属性和方法)5:返回值,当有没有返回值或返回非对象值,则返回创建的新对象,否则将返回值作为新对象返回。(也就是说必须要返回一个对象,这一步可以从下面的代码中总结出来)functionMyNew(){letConstructor=Array.prototype.shift.call(arguments);//1:取出构造函数letobj={}//2:执行会创建一个新的对象obj.__proto__=Constructor.prototype//3:对象的原型等于构造函数原型varresult=Constructor.apply(obj,arguments)//4:在执行函数代码中returntypeofresult==='object'?result:obj//5:返回值必须是对象}MyNew方法checkfunctionMan(name,age){this.name=namethis.age=age}vartom=newMan('tom',20)varmike=MyNew(Man,'mike',30)console.log(tominstanceofMan,mikeinstanceofMan)//true的实现truecallcall方法的实现主要有以下三步,如fn.call(obj,a,b):1:将调用函数fn的上下文指向obj2:形参a,b等用逗号分隔传入3:执行函数fn并返回结果Function.prototype.myCall=function(上下文){上下文=上下文?Object(context):windowcontext.fn=this//重置上下文letargs=[...arguments].slice(1)//拦截参数a,bletr=context.fn(...args)//执行函数deletecontext.fn//删除属性,避免pollutionreturnr//返回结果}myCall方法验证//在浏览器环境下vara=1,b=2;varobj={a:10,b:20}functiontest(key1,key2){console.log(this[key1]+this[key2])}test('a','b')//3测试。myCall(obj,'a','b')//30apply方法和call方法大同小异,唯一不同的是apply传入的参数是数组格式//apply原理Function.prototype.myApply=function(上下文){上下文=上下文?Object(context):windowcontext.fn=thisletargs=[...arguments][1]if(!args){returncontext.fn()}letr=context.fn(...args)删除上下文.fn;returnr}apply方法验证//浏览器环境下的vara=1,b=2;varobj={a:10,b:20}functiontest(key1,key2){控制台。log(this[key1]+this[key2])}test('a','b')//3test.myCall(obj,['a','b'])//30注意这里是传入的array['a','b']bind方法实现了bind方法和call和apply方法,区别在于它们都是改变上下文,但是bind不会立即执行函数。//bind原理Function.prototype.Mybind=function(context){let_me=thisreturnfunction(){return_me.apply(context)}}bind方法验证vara=1,b=2;varobj={a:10,b:20}functiontest(key1,key2){控制台。日志(这个[key1]+这个[key2])}varfn=测试。bind(obj)fn('a','b')//30好了,介绍到此结束,如果觉得对你有帮助,点个赞吧,呵呵!参考文章来源:掘金:《call,apply,bind,new实现原理》