问题:javascript
查询jquery源码:
そうですね
看代码:
输出结果:html
在jQuery对象中,每一个对象都有一个prevObject属性。java
问题1:这个属性何时建立??----->>> 只要你建立了jQuery对象就会产生
问题2:在哪里建立??------>>>> 在一个pushStack()方法里产生
问题3:做用??? ----->>>>指向操做前的jQuery对象引用
问题4:如何建立?? ------>>>> 看源码:
步骤:jquery
1. 建立一个jQuery对象,this.constructor()返回引用this 2. jQuery.merge 把elems节点,合并到新的jQuery对象 3. 给返回的新jQuery对象添加属性prevObject
如今是否是还有点不懂??不要紧,继续看图.....缓存
先查找$('.warp')的子元素,而后调用prevObject属性,对比一看,他们俩都是class=warp的最外层div,证实prevObject确实是指向前一个操做,若是不进行任何破坏源对象的状况下(就是不进行查询过滤操做),该对象的prevObject对象就指向一个jQuery本身定义的空间,并且任何对象的prevObject都指向它,如图:
总结:
备注:其实这个图略微有些瑕疵,$('.warp').children()其实指向的是一个$('.warp')的一个副本dom
$('.warp').children().prevObject != $('.warp') $('.warp').children().prevObject !== $('.warp')
优势:
1.很适合链式操做,好比我须要在一个父元素内寻找几个毫无规律的子元素设置属性或者搞其余事情,在javascript中,你须要:函数
$('.father').find('.son1').prop().... $('.father').find('.son5').prop().... ....
你看这代码,不停的建立这个父元素对象(固然你能够缓存这个父对象),并且必须写多行,俩者之间没有任何关联。而jquery利用了他们的共有规律(都是调用父元素去查找子元素进行操做,那我何不直接使用某个方法返回上一级操做的对象??)直接使用一个prevobject属性去返回它,这样就有了:性能
$('.father').find('.son1').prop().....巴拉巴拉操做 .prevObject.find('.son5').prop()...
直接一行完成操做像一条链子,不只好看,还一目了然....
2.咱们不多使用pushStack方法,然而在jQuery中,好多增删改查操做都会使用这个方法,这使得该方法的封装性和稳定性能都很very good!!ui
注意:addBack()方法返回的是当前操做对象和上一个操做对象,并且这个组合的新的对象会缓存在pushStack栈中this
当咱们写脚本的时候,对代码的封装都要很好的完成,把一些最基本的但又是涉及到不少函数操做时的方法封装在一个函数中,而后只提供一个接口给外面,相似于java的接口(高度抽象的方法),外面只能经过这个接口的一些属性或者方法去调用,你能够写在原型上,采用原型模式,或者组合使用构造函数模式和原型模式,若是不适合你也能够采用稳妥构造函数模式.
借鉴:
1.http://www.cnblogs.com/aaronj...
2.http://blog.csdn.net/wulex/ar...
3.https://stackoverflow.com/que...
4.https://www.learningjquery.co...
5.https://www.cnblogs.com/MnCu8...
6.http://jquery.cuishifeng.cn/i...
7.http://www.runoob.com/jquery/...