最近一直在看prototype.js的源代码,个人觉得Enumerable的each()最难理解。
今天大概看明白了,

.
1、Enumerable
//定义了两个异常对象,主要用于迭代控制
var $break = new Object();
var $continue = new Object();
/**
* Enumerable可以看作一个接口,_each(function(value))则看作接口中定义的定义的抽象方法
* _each是由Enumerable的继承类Array实现的.
* _each中的参数是个函数,即迭代器
* function(value) {
* try {
* iterator(value, index++);
* } catch (e) {
* if (e != $continue) throw e;
* }
* }
* 将实际的迭代器作为参数传递给Array中定义的_each()方法
* index计数器的作用是用于告诉迭代器当前执行到第几个元素
*/
var Enumerable = {
each: function(iterator) {
var index = 0;
try {
this._each(function(value) {
try {
iterator(value, index++);
} catch (e) {
if (e != $continue) throw e;//执行function(value,index)时;
//如遇异常则抛出($continue为实例化的一个对象,此处意在表明继续执行下一次操作)
}
});
} catch (e) {
if (e != $break) throw e;//执行_each遍历时如遇异常则抛出($break为实例化的一个对象,
//此处意在表明退出循环,结束遍历)
}
},
//........
}
2、Array ,继承Enumerable,并实现了Enumerable方法_each().
/**
* iterator是作为参数传入的,实际使用的是哪个函数或对象的方法是根据给定对象的性质决定的
* iterator是个函数类型的参数,每个具体的对象将实际的迭代器作为函数作为参数传入
* _each: function(iterator)是Enumerable中定义方法的实现
*/
Object.extend(Array.prototype, {
_each: function(iterator) {
for (var i = 0; i < this.length; i++)
iterator(this[i]);
},
//
}