介绍
这篇文章给大家分享的是有关JavaScript模拟实现新关键字的方法的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。
最近工作太忙,快接近两周没更新博客,总感觉有一些事情等着自己去做,虽然工作内容对自己提升挺大,但我总觉得,一直埋着头走的路,偶尔也需要抬起头来,看看现在和自己的期望向是否脱轨,所以周末还是选择来星巴克写些文字。
今天记录JavaScript中新的关键字的模拟实现,当我们在模拟实现某个语言行为之前,应该想想这个行为都做了哪些事情,通过实践,最后也能更加掌握知识点,这就是很多面试题都会问到模拟实现的原因,目的是为了考察候选人知识的深度。
函数人(名字){ this.name=名称; } var=new人(& # 39;jayChou& # 39;); typeof(人)//皁bject" 人instanceof//真实的 的人。__proto__===人。//真正的原型 的人。构造函数===//真正的人 的人。构造函数===Person.prototype。构造函数//真正的
以上,可以看出:
- <李>
新创建并返回了一个新对象,是构造函数的实例
李> <李>对象的实例的构造函数属性其实是构造函数的原型对象的构造函数属性
李> <李>对象实例的__proto__关联到构造函数的原型对象
李>上面的内容有关于JavaScript中原型对象和原型链的知识,不够清楚的同学可以查看我之前的博客。
由于新是JS的一个关键字,我们无法实现关键字,但我们可以通过函数的形式来模拟新关键字的行为。
一、基本思路
知道新关键字做了哪些工作,那我们就有了模拟实现的基本思路。
/* * *模拟实现JavaScript新操作符 * @param}{函数构造函数(构造函数) * @return {Regex函数对象| | | |日期错误}[返回结果) */函数mockNew () {//创建一个空对象 让resultObj=新对象();//取传入的第一个参数,即构造函数,并删除第一个参数。 让构造函数=Array.prototype.shift.call(参数);//类型判断,错误处理 如果类构造函数!==癴unction") { 把(“构造函数第一个参数应为函数“); }//绑定构造函数属性 resultObj。构造函数=构造函数;//关联__proto__到constructor.prototype resultObj。__proto__=constructor.prototype;//将构造函数的这指向返回的对象 构造函数。应用(resultObj参数);//返回对象 返回resultObj; } 函数的人(名字){ this.name=名称; } var=mockNew人(人,“jayChou"); console.log(人);//构造函数:?人(名字)//名称:“jayChou"//__proto__:对象
基本思路正确!所以我们完成了新关键字的初步模拟。伙伴们可以自己动手敲一下,每句代码自己是否都能理解。
二,处理返回值
构造函数也是函数,有不同类型返回值。有时候构造函数会返回指定的对象内容,所以要对这部分进行处理。
/* * *模拟实现JavaScript新操作符 * @param}{函数构造函数(构造函数) * @return {Regex函数对象| | | |日期错误}[返回结果) */函数mockNew () {//创建一个空对象 让emptyObj=新对象();//取传入的第一个参数,即构造函数,并删除第一个参数。//关于为什么要用Array.prototype.shift。调用的形式,见之前的博客文章《JavaScript之参数》 让构造函数=Array.prototype.shift.call(参数);//类型判断,错误处理 如果类构造函数!==癴unction") { 把(“构造函数第一个参数应为函数“); }//绑定构造函数属性 emptyObj。构造函数=构造函数;//关联__proto__到constructor.prototype emptyObj。__proto__=constructor.prototype;//将构造函数的这指向返回的对象 让resultObj=构造函数。应用(emptyObj参数);//返回类型判断,如果是对象,则返回构造函数返回的对象 如果(typeof resultObj===皁bject") { 返回resultObj }//返回对象 返回emptyObj; } 函数的人(名字){ this.name=名称; 返回{ 名称:this.name, 年龄:40 } } var=mockNew人(人,“jayChou"); console.log(人);//{名称:“jayChou",年龄:40岁}//年龄:40岁//名称:“jayChou"//__proto__:对象
当返回值返回了一个自定义对象后,模拟新函数就返回该自定义对象。
JavaScript新关键字的意义在于让普通函数生成一个新对象,并将对象实例的