JQuery 模块分析及其实现第一部分!
案例:获取指定 DOM 下所有子元素
- 在框架内部,遍历子节点,应该使用
firstChild和nextSibling两种方式实现,代码如下。
获取id为dv的元素下所有的子元素nodeType:1 - 12 (1 2 3 8 9 11 --documentFrament).
- 第一种方式:
childNodes
1 | // 实现思路: |
- 第二种方式:
firstChild nextSibling(推荐)
1 | //使用while方式 |
框架结构
在编写框架的时候,为了防止变量污染,尽量使用沙箱模式 封装框架
- 在沙箱内部,如果经常使用全局变量或全局对象的话,最好的做法就是将它们当做实参传入沙箱内。
核心函数为
itcast,相当于jQuery。最终要暴露给用户使用的实现
itcast函数,使用的是 工厂模式 来 创建对象。好处:用户new或 不new都可以得到正确的对象init构造函数 的 位置- 如果放在沙箱内部,用户是无法修改或重写的。所以要容纳更改用户,尽量将构造函数暴露给用户
- 可以把构造函数放在
itcast函数上,也可以放在itcast函数原型上。 - 处于
jQuery之父,在写简单继承模式时,将构造函数放在其原型上。那么在编写框架时,即延续下来了
init创建出来的对象,最终继承自itcast.prototype。所以可以将init对象称为itcast对象。由于暴露给用户 的 是
itcast和 其原型。所以在扩展成员时,只能在这两个对象上扩展。而在函数对象上扩展的成员 为 静态成员。可以直接通过函数名字来访问。但是,在原型上的成员,必须创建实例来访问。因此为了实现init对象可以访问itcast原型上的成员,就基于原型来实现继承。
1 | (function (global) { |
完善
init构造函数selector类型:- 无效值:
nullundefined' 'false - 字符串
_ 选择器:div根据选择器筛选 dom 元素,并以伪数组形式 存储在this上
_html字符串<p>123</p><p>456</p><p>将 html 字符串 转换成html元素 DOM节点DOM数组(伪数组)function:入口函数DOMContentLoaded
_ 使用静态属性isReady存储dom树是否加载完毕
_ 判断isReady值, 如果为true,就直接执行传入的函数。 * 否则,就给document的DOMContentLoaded事件绑定处理程序,在处理程序中,先将isReady赋值为true,在执行传入的函数。
- 无效值:
如何判断字符串为
html字符串,必须满足一下条件:- 以
<开头 - 以
>结尾 - 最小长度为
3
- 以
如何判断像数组(数组和伪数组)
用
length属性去判断,若具有length属性 表示为 像数组类型除了
window对象以及函数对象{length: 1} {4: "123", length: 5}稀疏数组如果为真数组,返回
true如果
length属性值为0(除了window对象以及函数对象),返回true如果
length属性值>0, 如果对象 具有length - 1索引,返回true
全局对象
window特性:有一个window属性 引用 自身。
1 | (function (global) { |
到此,一个完整的 init 框架结构就好了!