在 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 指向的一些知识点啦!
第一次写类似这样的文章, 还是有点小紧张. 我希望这篇文章能够帮助到一些对这块知识点还不是太明白的朋友. 如果有什么不对的地方还请各位大佬指正!
完结, 撒花!!!
来源: http://www.jianshu.com/p/aec920eb6675