javascript設(shè)計模式之迭代器模式
迭代器模式介紹
- 順序訪問一個集合
順序:如數(shù)組、類數(shù)組稱為順序,而非對象,能從0,1,2…通過index訪問的值
- 使用者無需知道集合的內(nèi)部結(jié)構(gòu)
示例
如果要對這三個變量進(jìn)行遍歷,需要寫三個遍歷方法
<p>each1</p>
<p>each2</p>
<p>each3</p>
...
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
<script>
var arr = [1,2,3]
var nodeList = document.getElementsByTagName('p')
var $p = $('p')
// 如果要對這三個變量進(jìn)行遍歷,需要寫三個遍歷方法
// 1
arr.forEach(function(item){
console.log(item)
})
// 2
var i;length = nodeList.length
for(i = 0;i < length;i ++) {
console.log(nodeList(i))
}
// 3
$p.each(function(key, p){
console.log(key,p)
})
</script>
如果寫成一個遍歷方法,拿jquery的$.each舉例,則這種方法稱為迭代器模式
// 如果寫成一個遍歷方法,拿jquery的$.each舉例,則這種方法稱為迭代器模式
var arr = [1,2,3]
var nodeList = document.getElementsByTagName('p')
var $p = $('p')
function each(data){
var $data = data
$data.each(function(key, val){
console.log(key, val)
})
}
each(arr)
each(nodeList)
each($p)
迭代器模式UML類圖
UML類圖: 用圖的方式表示各個類所有的屬性及相互之間的引用、繼承關(guān)系

迭代器模式原生代碼演示
class Iterator {
constructor(conatiner) {
this.list = conatiner.list
this.index = 0
}
next() {
if (this.hasNext()) {
return this.list[this.index++]
}
return null
}
hasNext() {
if (this.index >= this.list.length) {
return false
}
return true
}
}
class Container {
constructor(list) {
this.list = list
}
getIterator() {
return new Iterator(this)
}
}
// 測試代碼
let container = new Container([1, 2, 3, 4, 5])
let iterator = container.getIterator()
while(iterator.hasNext()) {
console.log(iterator.next())
}
迭代器模式的場景
- jquery each
- ES6 Iterator
ES6 語法中,有序集合的數(shù)據(jù)類型已經(jīng)有很多,例如
- Array
- Map
- Set
- String
- Arguments
- NodeList
- 以上數(shù)據(jù)類型都有[Symbol.iterator]屬性,Symbol.iterator理解成唯一的key即可,屬性值是一個函數(shù),執(zhí)行函數(shù)返回一個迭代器,這個迭代器就有next方法可順序迭代子元素
- 通過Array.prototype[Symbol.iterator]來測試迭代器
- object不是有序集合,可以用Map來代替

ES6 Iterator示例
let arr = [1, 2, 3, 4]
let nodeList = document.getElementsByTagName('p')
let m = new Map()
m.set('a', 100)
m.set('b', 200)
function each(data) {
// 生成遍歷器
let iterator = data[Symbol.iterator]()
let item = {done: false}
while (!item.done) {
item = iterator.next()
if (!item.done) {
console.log(item.value)
}
}
}
each(arr)
each(nodeList)
each(m)
由于Symbol.iterator屬性并不是人所知,同時并是每次用到它是都需要封裝一個each方法,因此有了es6新語法for…of語法,以上代碼可以這樣寫
function each(data) {
for (let item of data) {
console.log(item)
}
}
each(arr)
each(nodeList)
each(m)
擴(kuò)展
ES6 Iterator與Generator Iterator的價值不限于上述的幾種類型遍歷還有Generator函數(shù)的使用即返回的數(shù)據(jù)只要符合Iterator接口的要求(存在Symbol.iterator屬性),就可以使用Iterator語法,即迭代器模式

總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
使用js聲明數(shù)組,對象在jsp頁面中(獲得ajax得到j(luò)son數(shù)據(jù))
使用js聲明數(shù)組,對象在jsp頁面中(獲得ajax得到j(luò)son數(shù)據(jù))。需要的朋友可以過來參考下,希望對大家有所幫助2013-11-11
JavaScript While 循環(huán)基礎(chǔ)教程
只要指定條件為 true,循環(huán)就可以一直執(zhí)行代碼,2007-04-04
Javascript基礎(chǔ)_簡單比較undefined和null 值
下面小編就為大家?guī)硪黄狫avascript基礎(chǔ)_簡單比較undefined和null 值。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-06-06
JavaScript入門教程(9) Document文檔對象
Document文檔對象是JavaScript中window和frames對象的一個屬性,是顯示于窗口或框架內(nèi)的一個文檔。2009-01-01
JavaScript入門教程(10) 認(rèn)識其他對象
對于需要更好的控制html的一些元素,就需要了解這些了。大家知道就行,有需要時可以再看。2009-01-01

