浏览 985 次
|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
时间:2007-07-31 关键字: prototype
在研究prototype源代码时,在enumerable接口中有一个each方法,each方法中还有一个this._each方法的调用,后边的Array数组对象实现了_each方法,具体代码如下:
Enumerable中的each方法:
each: function(iterator) {
var index = 0;
try {
this._each(function(value)
try {
iterator(value, index++);
} catch (e) {
if (e != $continue) throw e;
}
});
} catch (e) {
if (e != $break) throw e;
}
},
Array中的_each方法:
Object.extend(Array.prototype, {
_each: function(iterator) {
for (var i = 0; i < this.length; i++)
iterator(this[i]);
},
具体应用:
*var arr = [1,2,3,4,8,5,4,3];
// 依次输出1,2,3,4,5,4,3
arr.each(
function (item, index) {
if (item < 6) {
alert(item);
} else {
throw $continue;
}
}
);
现在我就是不太清楚each方法的调用机制,希望有人可以指点一下,谢谢:) 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2007-07-31
只不过是把方法当参数传递,
你把你写的这三个代码串成一个方法,就容易看了。 |
|
| 返回顶楼 | |
|
时间:2007-07-31
weiqingfei 写道 只不过是把方法当参数传递, 那Array中的:
你把你写的这三个代码串成一个方法,就容易看了。 flatten: function() { return this.inject([], function(array, value) { return array.concat(value.constructor == Array ? value.flatten() : [value]); }); }, 调用Enumerable中的inject: inject: function(memo, iterator) { this.each(function(value, index) { memo = iterator(memo, value, index); }); return memo; }, 其中iterator(memo, value, index)怎么是三个参数,iterator不是 function(array, value) { return array.concat(value.constructor == Array ? value.flatten() : [value]); }吗? |
|
| 返回顶楼 | |
|
时间:2007-07-31
基本的原理这是样的,首先会调用Enumerable 中的each方法,因为Array已经扩展了Enumerable,有源码
Object.extend(Array.prototype, Enumerable); 在Array中又写了个私有方法_each,在each中回调用Array中的_each方法,在这个方法中的this指向的是你的数组,ok for循环会遍历这个数组,每次都调用
function(value)
try {
iterator(value, index++);
} catch (e) {
if (e != $continue) throw e;
}
}
在Array中的_each中调用了 iterator(this[i]);this[i]是你数组的每个值,等于他又调回到Enumerable,中的each,这是value,就是数组的值了,而在each中的iterator就是你的自己的方法,然后就是执行你的方法了 这样就遍历你数组并用你的方法做了事情 |
|
| 返回顶楼 | |
|
时间:2007-07-31
campaign 写道 基本的原理这是样的,首先会调用Enumerable 中的each方法,因为Array已经扩展了Enumerable,有源码
谢谢,基本明白了,可是Array中的flatten有什么用呢,应该如何调用,还有就是三楼的问题还不是太明白
Object.extend(Array.prototype, Enumerable); 在Array中又写了个私有方法_each,在each中回调用Array中的_each方法,在这个方法中的this指向的是你的数组,ok for循环会遍历这个数组,每次都调用
function(value)
try {
iterator(value, index++);
} catch (e) {
if (e != $continue) throw e;
}
}
在Array中的_each中调用了 iterator(this[i]);this[i]是你数组的每个值,等于他又调回到Enumerable,中的each,这是value,就是数组的值了,而在each中的iterator就是你的自己的方法,然后就是执行你的方法了 这样就遍历你数组并用你的方法做了事情 |
|
| 返回顶楼 | |
|
时间:2007-07-31
其实这种调用在protoype源代码中挺常见的,比如Array中的without方法:
without: function() { var values = $A(arguments); return this.select(function(value) { return !values.include(value); }); }, 这个方法的调用是(function).without(arguments); 但是其中的调用细节我就不是很明白了,比如this.select(function(value) { return !values.include(value); }); 这一段代码是如何调用的? |
|
| 返回顶楼 | |
|
时间:2007-07-31
给你个例子,
['A',['B1','B2']].flatten() //['A','B1','B2'] 参数的问题是这样,memo是array,value是遍历的每个对象,index是下标 inject方法就是把你处理过的对象数组注入到你的第一个参数中,flatten没什么好解释就是
array.concat(value && value.constructor == Array ?
value.flatten() : [value]
关建的一句,当你这个对象如果还是数组ok递归调用flatten,如果不是那就把它追加到array中, inject方法就是调用each方法,只是每次调用都背着memo,最后返回memo,所以当你在用inject的时候,function必须有return |
|
| 返回顶楼 | |
|
时间:2007-07-31
campaign 写道 给你个例子,
谢谢,明白了!
['A',['B1','B2']].flatten() //['A','B1','B2'] 参数的问题是这样,memo是array,value是遍历的每个对象,index是下标 inject方法就是把你处理过的对象数组注入到你的第一个参数中,flatten没什么好解释就是
array.concat(value && value.constructor == Array ?
value.flatten() : [value]
关建的一句,当你这个对象如果还是数组ok递归调用flatten,如果不是那就把它追加到array中, inject方法就是调用each方法,只是每次调用都背着memo,最后返回memo,所以当你在用inject的时候,function必须有return 其实我觉得array.toString和flatten()功能是一样的。 |
|
| 返回顶楼 | |






