jQuery中每一个对象都是一个新的jQuery.fn.init()实例,所以即使两个jQuery中包含的DOM元素相同,这两个jQuery对象也并无关系。
好了,那么静态方法就是给jQuery对象附加一个uid,而实例方法则就是给jQuery对象中的DOM节点上附加uid。这就是为啥静态方法不覆盖而实例方法覆盖的原因了
好了,那么静态方法就是给jQuery对象附加一个uid,而实例方法则就是给jQuery对象中的DOM节点上附加uid。这就是为啥静态方法不覆盖而实例方法覆盖的原因了
2016-11-25
看到这里,我思考了很久,终于搞懂了以前一直疑惑的地方。
直接看代码:
代码一:
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中每一个对象都是一个新的 。。。。
直接看代码:
代码一:
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中每一个对象都是一个新的 。。。。
2016-11-25
接上: 比如说我们有一个缓存池的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],对其进行操作。
当我们要操作a的缓存对象时,我们需要找到a的20161124.1825 = 1属性,根据这个属性找到expando为20161124.1825的缓存池,然后找到缓存池中的cache[1],对其进行操作。
2016-11-24
个人理解(可能有错误啊,请高手指点):Data()构造函数本身所要构造的就是缓存池对象,因为可能有多个缓存池,所以,为了给每个缓存池一个独一无二的id,就用了这段代码:this.expando = jQuery.expando + Math.random();每一个缓存池对象都有expando属性,这个属性保存了其自身的id,而且这个id值几乎不可能与其他缓存池的expando属性值相同。
然后每个缓存池可能有多个DOM元素映射对象,凡事从属于这个缓存池的DOM元素都存在一个 与这个缓存池的expando属性的值相同的属性,这个属性保存了自身的映射对象在缓存池中对应的key。 字数限制另起评论
然后每个缓存池可能有多个DOM元素映射对象,凡事从属于这个缓存池的DOM元素都存在一个 与这个缓存池的expando属性的值相同的属性,这个属性保存了自身的映射对象在缓存池中对应的key。 字数限制另起评论
2016-11-24
不知道我的理解对不对:
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的缓存数据对象。
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的缓存数据对象。
2016-11-24
在开发中,我们可能会为DOM节点自定义添加很多属性,如果给DOM元素添加自定义的属性和过多的数据可能会引起内存泄漏,所以要尽量避免这么干。(在js中内存泄漏的大多情况都是由于DOM节点与js对象循环引用引起的) ,为了在给DOM附加额外属性的同时不引起内存泄漏,引入了数据缓存系统。
数据缓存接口有两个:$.data() .data()
数据缓存接口有两个:$.data() .data()
2016-11-24
觉得老师对memory的解释有些歧义,看完了这节课,我觉得 本例中的memory变量是保存了当前的fire函数的参数,每次添加一个新的观察者函数,就用当前的memory变量作为参数调用这个添加的观察者函数一次。
2016-11-21
memory = options === 'memory' && data; 我一直以为memory的最终结果为true或者false,现在我才发现原来我没有弄明白 与 的真谛! 假如 options === ‘memory’ 的话,memory = data。 其余情况 memory = false
2016-11-21
随着后面课程的学习,发现jQuery的实现方式跟我想的不一样啊,我的实现思路就是实现一个被观察者池,为每一个被观察者命名;而jQuery则是在函数内部定义一个观察者数组,然后使用闭包的方式返回一个对象;如果用我的方法的话,还得额外检测名字是否重复。问世间是否有山比此山更高,一山还比一山高啊
2016-11-21
今天又看了一遍,发现以前对这节课的理解是错的!! 第19行, arguments.callee 指的是setTimeout内的函数,指的不是Aaron !! 大家可以添加一句console.log(arguments.callee)试试。
另外我一直思考,为啥要用setTimeout函数,百度得到了这个答案:settimeout的作用机制其实是把函数加入到全局(window)的空间里的任务队列
另外我一直思考,为啥要用setTimeout函数,百度得到了这个答案:settimeout的作用机制其实是把函数加入到全局(window)的空间里的任务队列
2016-11-20
@javaeye 观察不仔细啊! 明明是 callee 不是 call!
callee返回正在执行的函数本身的引用,它是arguments的一个属性!
callee返回正在执行的函数本身的引用,它是arguments的一个属性!
2016-11-20
@小姜姜姜姜 'arguments.callee(List) 这句话可以换成 Aaron(List,callback) 这样的话就需要每次执行25毫秒'
建议不要换,因为如果换了的话,以后我们需要对函数重命名的话,那我们就得改两处。
建议不要换,因为如果换了的话,以后我们需要对函数重命名的话,那我们就得改两处。
2016-11-20