jQuery源码阅读计划-8月3日-1/40
1.jQuery无new构建
我们希望做到的事情是:我们只需要写var $ = jQuery();就可以在新建一个工具对象,同时如果我们想var $ = new jQuery()的时候也可以得到同样的效果。
做到这件事情的关键就是将所有工具方法都写在jQuery.prototype里面,并且在无new构建的时候,返回和使用new构建时一样的对象。
怎么做才能返回一样的对象呢?
返回对象首先应该想到的应该就是return new xxx();这样的形式。
那么这个xxx()应写在哪里呢?
应该写在jQuery.prototype里面,因为我们希望返回的对象是能操作所有工具和属性的,所以xxx的位置应该在jQuery.prototype里面
- 要实现无new构建,首先jQuery对象本身必须是一个函数
- 这个函数返回自己的prototype中的一个init构造函数生成的对象
- 返回的这个对象应该是一个和jQuery.prototype一样的对象(但不是同一个对象)
- 但是问题在于init构造函数中的return this中的this指向并不是我们想要的jQuery.prototype
- 解决方法很简单,只需要将init的prototype指向jQuery.prototype,函数jQuery返回的对象就可以得到jQuery.prototype的所有属性和方法
2.链式调用
很简单,所有方法在操作完之后都return this就可以了。
3.插件接口
所谓的插件接口其实就是extend方法,这个方法并不用来专门接入插件。
这个方法仅用于扩展对象的属性和方法。这个方法第一个参数确定是否深拷贝,第二个参数是将得到扩展的对象,第三四五六以后的参数是提供扩展数据的对象。
jQuery和jQuery.fn上都有这个方法(实现完全一样),其中jQuery上的这个方法常用来扩展对象,jQuery.fn上的这个方法用来接入插件的新方法。
对于extend的实现有几点需要注意:
- 是否深拷贝
- 传入的target对象不是一般对象怎么办
- 调用方法时只传入了一个target对象怎么办
- 防止自引用
- 深拷贝时需要考虑克隆的值是数组和普通对象的两种情况
浙公网安备 33010602011771号