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对象怎么办
  • 防止自引用
  • 深拷贝时需要考虑克隆的值是数组和普通对象的两种情况

posted on 2016-08-03 19:53  JayusTree  阅读(154)  评论(0)    收藏  举报

导航