在ES5中,函数的被执行的方式不同,该函数体中的this指向也可能是不一样的,因为只有在函数执行的时候this指向才开始确定。
当我们用 new 函数名()来执行函数的时候,该函数我们就称之为构造函数,他在执行之前会进行预编译,这个时候会确定this的指向,它会在内部将this指向即将被构造(返回)出来的实例化对象。这里呢,我们可以这样理解,系统内部通过Object.create(构造函名.prototype),然后将它返回的值(一个新的隐式原型指向构造函数的原型的对象)赋值给this。接下来的代码该怎么执行就怎么执行,和普通函数一样。只不过接下来函数体中的this指向的是即将被返回的实例化对象。
接来下,分为人为的给函数添加return xxx;这条语句 和 系统默认添加。
- 如果是系统默认添加,这个好办,直接给你返回this,注意,这个this是指向即将被返回的实例化对象的。
- 如果是人为添加,也分为两种情况,看你返回的是什么类型
- 如果是原始类型的值,比如(number,string,undefined,null(注意:这里把null也归为原始类型,尽管typeof null返回的是“object”),boolean),那么系统内部会忽略你自己写的,还是会给你返回this。
-如果是引用类型,如(function,array,object),则就按照你给的值返回,这个时候我们最后得到的就不是实例化对象了,而是你自己给出的返回值。
说了这么多直接上代码吧,简洁明了!
function Test (){
this = Object.create(Test.prototype); // 可以这么去理解,实际上this不能这么使用。这里Ob.cerate()的第一个参数表示该函数执行后的返回结果(一个对象)的隐式原型(__proto__)为Test.prototype(Test函数身上的一个对象,这个对象称为Test函数的原型)。
xxx;// 这个代码段该怎么执行就怎么执行,只是this指向是即将被返回的实例化对象
return this; // 如果没有自己返回一个引用类型,系统就会自动返回this。当然,我们通过new 来执行这个函数,肯定是希望返回一个实例化对象。这里一般只有面试的时候才会问到。应该属于冷门的知识点了。
}
以上就是在ES5中使用new关键字来执行函数的关于this指向的一些知识点啦!
第一次写类似这样的文章,还是有点小紧张。我希望这篇文章能够帮助到一些对这块知识点还不是太明白的朋友。如果有什么不对的地方还请各位大佬指正!
完结,撒花!!!
网友评论