data数据缓存实现
1: h5已经支持在dom上自定义属性,为什么还需要数据缓存方法,自定义属性有哪些弊端,是否可以覆盖所有场景需要,数据缓存方法优点又是什么?接下来一一分析
a:oDiv.name='jhon', oDiv.age='20',看出来,自定义属性基本上都是针对基本类型,对于复杂的数据类型,比如数组或者对象
b:传闻dom节点与对象之间的互相引用会导致内存泄露,所以如果在dom节点上挂载对象,那么从理论层面就是不合理
2: 代码设计考虑的因素
a:如果dom节点上有个自定义属性,比如oDiv.name='jhon', 当通过data数据缓存又添加一个name属性,此时能不能覆盖$.data(dom, name, 'bella'),就要分析数据缓存只是一个缓存数据的功能,不能去修改dom节点上的其它属性,即使属性名相同,也不能覆盖
b:为了防止上述情景,可以定一个永远都不会与dom节点上相同的属性,让它的值作为key,定义一个cache缓存对象,这样利用key就可以找到cache中的值
c:设计这个方法的时候,静态方法和实例方法上都要实现,还是通过实例方法调用静态方法
3: 代码实现思路
a: 需要向jquery上扩展很多工具方法,data,removedata,hasdata等方法,这些方法操作的针对同一个对象,这么多工具方法针对一个dom节点,可以用面向对象的思想,把所有的方法在原型上实现,通过实例调用,简化代码,比如$.data(在内部可以调用data_user实例上的方法),方法具有整合性
b:通过参数的不同可以设计到底是设置还是获取,如果三个参数就是设置,两个参数是获取,当$.data(body, 'name', 'jhon')的时候,就是设置,问题来了,到底是在入口通过参数判断实现set/get,还是通过一个中间方法,第一种方式,在data方法种,通过if判断两个还是三个参数从而调用set get方法,第二种方式,封装一层access作为入口处理文件,在内部去判断到底调用set/get,而且内部还可以实现其它业务逻辑



c:为什么要实例化一个data_user出来,而不是向之前那样,每个方法写自己的内部逻辑,因为这些静态方法操作的是同一个数据源,$.data(), $.removedata() 最终操作的都是cache缓存数据,这个cache需要在每个函数中(data, remove)都能访问到,那么可以定义全局,哪里都可以访问,然后定义全局定义set方法,显然是不合适的,换个思路,创建一个构造函数,然后把所有函数封装在原型下,然后cache挂载到实例上,这样在每个工具方法中,只需要通过实例就可以拿到cache数据,而且还有助于方法的统一管理

d: 构造函数,需要挂载一个cache对象,然后需要prototype统一管理方法,然后实力话类,就可以访问cache数据,并且间接通过data_use方法实现工具方法

e: 该函数的实现,是一个入口函数,去分配调用set / get函数,如果是get,那么access不需要返回值的,在if中就要return可以了,判断value不能用 value == null,如果用户就是想设置属性是null,结果被认定是获取了,先不着急实现,主要看下面的返回值,如果是set,那么返回的值需要判断,如果key是字符串,那么可能是设置或者获取,如果key是对象,肯定是设置了,当key是对象后,value才是undefined


浙公网安备 33010602011771号