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
类型:- 无效值:
null
undefined
' '
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
框架结构就好了!