为了账号安全,请及时绑定邮箱和手机立即绑定
jQuery中每一个对象都是一个新的jQuery.fn.init()实例,所以即使两个jQuery中包含的DOM元素相同,这两个jQuery对象也并无关系。
好了,那么静态方法就是给jQuery对象附加一个uid,而实例方法则就是给jQuery对象中的DOM节点上附加uid。这就是为啥静态方法不覆盖而实例方法覆盖的原因了
看到这里,我思考了很久,终于搞懂了以前一直疑惑的地方。
直接看代码:
代码一:
var a1 = document.getElementById('#ha');
var a2 = document.getElemnetById('#ha');
console.log(a1 ==a2) // true
代码二:
var a1 = $('#ha');
var a2 = $('#ha');
console.log(a1 == a2) // false
不同的结果,我以前一直以js的思想思考jQuery。jQuery中每一个对象都是一个新的 。。。。
接上: 比如说我们有一个缓存池的expando属性的值为20161124.1825 ,在这个缓存池中 只有 一个名为 a 的DOM元素,那么就会为a附加一个属性20161124.1825 ,也就是a.20161124.1825 = 1 (为什么不是0呢?看上面的代码this.cache[0]是一个函数,返回某个对象且不能修改)。
当我们要操作a的缓存对象时,我们需要找到a的20161124.1825 = 1属性,根据这个属性找到expando为20161124.1825的缓存池,然后找到缓存池中的cache[1],对其进行操作。
个人理解(可能有错误啊,请高手指点):Data()构造函数本身所要构造的就是缓存池对象,因为可能有多个缓存池,所以,为了给每个缓存池一个独一无二的id,就用了这段代码:this.expando = jQuery.expando + Math.random();每一个缓存池对象都有expando属性,这个属性保存了其自身的id,而且这个id值几乎不可能与其他缓存池的expando属性值相同。
然后每个缓存池可能有多个DOM元素映射对象,凡事从属于这个缓存池的DOM元素都存在一个 与这个缓存池的expando属性的值相同的属性,这个属性保存了自身的映射对象在缓存池中对应的key。 字数限制另起评论
不知道我的理解对不对:
1 DOM元素
cache = {id1:{ },id2:{ }......}
DOM.cache_id = some_number // 数据类型是数字
当我们要操作DOM的缓存数据时,我们需要访问他的cache_id属性,这个属性的值是数字类型,取到值以后,使用cache[some_number]就得到了该DOM的缓存数据对象。 DOM的cache_id属性只是保存了映射关系,并没有绑定额外的js对象。
2 js对象
缓存数据对象直接存储在该js对象的某个属性中。操作这个js对象的属性就是操作这个js的缓存数据对象。
在开发中,我们可能会为DOM节点自定义添加很多属性,如果给DOM元素添加自定义的属性和过多的数据可能会引起内存泄漏,所以要尽量避免这么干。(在js中内存泄漏的大多情况都是由于DOM节点与js对象循环引用引起的) ,为了在给DOM附加额外属性的同时不引起内存泄漏,引入了数据缓存系统。
数据缓存接口有两个:$.data() .data()
恭喜你,通过了本次课程 返回课程
觉得老师对memory的解释有些歧义,看完了这节课,我觉得 本例中的memory变量是保存了当前的fire函数的参数,每次添加一个新的观察者函数,就用当前的memory变量作为参数调用这个添加的观察者函数一次。
memory = options === 'memory' && data; 我一直以为memory的最终结果为true或者false,现在我才发现原来我没有弄明白 与 的真谛! 假如 options === ‘memory’ 的话,memory = data。 其余情况 memory = false
随着后面课程的学习,发现jQuery的实现方式跟我想的不一样啊,我的实现思路就是实现一个被观察者池,为每一个被观察者命名;而jQuery则是在函数内部定义一个观察者数组,然后使用闭包的方式返回一个对象;如果用我的方法的话,还得额外检测名字是否重复。问世间是否有山比此山更高,一山还比一山高啊
随着我们的使用,optionsCache会存入所有的可能的参数组合。
今天又看了一遍,发现以前对这节课的理解是错的!! 第19行, arguments.callee 指的是setTimeout内的函数,指的不是Aaron !! 大家可以添加一句console.log(arguments.callee)试试。
另外我一直思考,为啥要用setTimeout函数,百度得到了这个答案:settimeout的作用机制其实是把函数加入到全局(window)的空间里的任务队列
貌似1.8版本之后,load就抛弃了·····只剩下ajax的load了
@javaeye 观察不仔细啊! 明明是 callee 不是 call!
callee返回正在执行的函数本身的引用,它是arguments的一个属性!
@小姜姜姜姜 'arguments.callee(List) 这句话可以换成 Aaron(List,callback) 这样的话就需要每次执行25毫秒'
建议不要换,因为如果换了的话,以后我们需要对函数重命名的话,那我们就得改两处。
很精妙!self 存在外部引用 + 闭包
课程须知
源码的阅读不是一蹴而就的,需要大家有一定的功底,比如jQuery的基础运用以及API的熟悉度,除此之外要有牢固的javascript、DOM、CSS的基础功底,甚至还需要理解常见的设计模式、数据结构等等。当然大家也不要被这些给吓住了,理解,总是需要一种慢慢的学习过程。
老师告诉你能学到什么?
通过本课程的学习,您可以由浅入深地剖析jQuery库的设计与实现。 其中我们围绕的重心: 1、设计理念 2、结构组织 3、接口设计 4、模式运用 5、场景套用

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!

本次提问将花费2个积分

你的积分不足,无法发表

为什么扣积分?

本次提问将花费2个积分

继续发表请点击 "确定"

为什么扣积分?

举报

0/150
提交
取消