protoype.js學(xué)習(xí)(二)
??????最近一直在看prototype.js的源代碼,個(gè)人覺得Enumerable的each()最難理解。今天大概看明白了,

1、Enumerable
??????
//定義了兩個(gè)異常對象,主要用于迭代控制
var?$break?=?new?Object();
var?$continue?=?new?Object();
/**
?*?Enumerable可以看作一個(gè)接口,_each(function(value))則看作接口中定義的定義的抽象方法
?*?_each是由Enumerable的繼承類Array實(shí)現(xiàn)的.
?*?_each中的參數(shù)是個(gè)函數(shù),即迭代器
?*?????????????????function(value)?{
?*????????????????try?{
?*????????????????????iterator(value,?index++);
?*????????????????????}?catch?(e)?{
?*????????????????????if?(e?!=?$continue)?throw?e;
?*????????????????????}
?*????????????????}
?*?????將實(shí)際的迭代器作為參數(shù)傳遞給Array中定義的_each()方法
?*??? index計(jì)數(shù)器的作用是用于告訴迭代器當(dāng)前執(zhí)行到第幾個(gè)元素
?*/
var?Enumerable?=?{
????each:?function(iterator)?{
????????var?index?=?0;
????????try?{
????????????this._each(function(value)?{
????????????????try?{
????????????????????iterator(value,?index++);
????????????????}?catch?(e)?{
????????????????????if?(e?!=?$continue)?throw?e;//執(zhí)行function(value,index)時(shí);
????????????????????????????????????????????????//如遇異常則拋出($continue為實(shí)例化的一個(gè)對象,此處意在表明繼續(xù)執(zhí)行下一次操作)
????????????????????
????????????????}
????????????});
????????}?catch?(e)?{
????????????if?(e?!=?$break)?throw?e;//執(zhí)行_each遍歷時(shí)如遇異常則拋出($break為實(shí)例化的一個(gè)對象,
????????????????????????????????????????????????//此處意在表明退出循環(huán),結(jié)束遍歷)
????????}
????},
? //........
}
var?$break?=?new?Object();
var?$continue?=?new?Object();
/**
?*?Enumerable可以看作一個(gè)接口,_each(function(value))則看作接口中定義的定義的抽象方法
?*?_each是由Enumerable的繼承類Array實(shí)現(xiàn)的.
?*?_each中的參數(shù)是個(gè)函數(shù),即迭代器
?*?????????????????function(value)?{
?*????????????????try?{
?*????????????????????iterator(value,?index++);
?*????????????????????}?catch?(e)?{
?*????????????????????if?(e?!=?$continue)?throw?e;
?*????????????????????}
?*????????????????}
?*?????將實(shí)際的迭代器作為參數(shù)傳遞給Array中定義的_each()方法
?*??? index計(jì)數(shù)器的作用是用于告訴迭代器當(dāng)前執(zhí)行到第幾個(gè)元素
?*/
var?Enumerable?=?{
????each:?function(iterator)?{
????????var?index?=?0;
????????try?{
????????????this._each(function(value)?{
????????????????try?{
????????????????????iterator(value,?index++);
????????????????}?catch?(e)?{
????????????????????if?(e?!=?$continue)?throw?e;//執(zhí)行function(value,index)時(shí);
????????????????????????????????????????????????//如遇異常則拋出($continue為實(shí)例化的一個(gè)對象,此處意在表明繼續(xù)執(zhí)行下一次操作)
????????????????????
????????????????}
????????????});
????????}?catch?(e)?{
????????????if?(e?!=?$break)?throw?e;//執(zhí)行_each遍歷時(shí)如遇異常則拋出($break為實(shí)例化的一個(gè)對象,
????????????????????????????????????????????????//此處意在表明退出循環(huán),結(jié)束遍歷)
????????}
????},
? //........
}
2、Array ,繼承Enumerable,并實(shí)現(xiàn)了Enumerable方法_each().
????????????
/**
?????*?iterator是作為參數(shù)傳入的,實(shí)際使用的是哪個(gè)函數(shù)或?qū)ο蟮姆椒ㄊ歉鶕?jù)給定對象的性質(zhì)決定的
?????*?iterator是個(gè)函數(shù)類型的參數(shù),每個(gè)具體的對象將實(shí)際的迭代器作為函數(shù)作為參數(shù)傳入
?????*?_each:?function(iterator)是Enumerable中定義方法的實(shí)現(xiàn)
?????*/
Object.extend(Array.prototype,?{
????_each:?function(iterator)?{
????????for?(var?i?=?0;?i?<?this.length;?i++)
????????????iterator(this[i]);
????},
???//
}
?????*?iterator是作為參數(shù)傳入的,實(shí)際使用的是哪個(gè)函數(shù)或?qū)ο蟮姆椒ㄊ歉鶕?jù)給定對象的性質(zhì)決定的
?????*?iterator是個(gè)函數(shù)類型的參數(shù),每個(gè)具體的對象將實(shí)際的迭代器作為函數(shù)作為參數(shù)傳入
?????*?_each:?function(iterator)是Enumerable中定義方法的實(shí)現(xiàn)
?????*/
Object.extend(Array.prototype,?{
????_each:?function(iterator)?{
????????for?(var?i?=?0;?i?<?this.length;?i++)
????????????iterator(this[i]);
????},
???//

}