我们再来看看init 函数中返回的 this 到底是什么,我在之前的博客中讲过,函数中的this总是指向运行期
的调用者,那init的调用者是谁呢?在上面代码中似乎找不到调用者,这时我们就需要深入的理解new运
算符的运行机制了,借用我之前在博客中对new运算符的描述,我们对new init()的执行过程进行如下分
解:
new init(selector,context,root) = { var obj = {};
obj.__proto__ = init.prototype;
init.call(obj,selector,context,root); return typeof result === 'obj'? result : obj
}
从上述分解过程可以看出,javascript在通过 new 来创建一个实例对象的时候,会先创建了一个普通对
象obj,然后将obj的内部属性__proto__指向了init的原型对象,因此obj的原型链将被改变,而第3步使
用call方法调用init(),所以init中的this指的就是这里的obj对象。
init()执行以后,会将匹配到的所有DOM对象以数组的方式存储到this对象中并返回,也就是返回了obj对
象,而new运算符最终也会将这个 obj 对象返回以作为新的实例对象。所以new运算符返回的这个实例
对象具备两个特点:一是包含了DOM查询结果集,二是其原型链继承了init的prototype,而 init 的 proto
type 又指向了jQuery.fn对象,因此实例对象也具备了这些操作方法。