论坛首页 AJAX版 JavaScript

关于prototype 1.5中Enumerable中each的用法(疑问)

浏览 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方法的调用机制,希望有人可以指点一下,谢谢:)
   
时间:2007-07-31
只不过是把方法当参数传递,

你把你写的这三个代码串成一个方法,就容易看了。
   
0 请登录后投票
时间: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]);
}吗?
   
0 请登录后投票
时间: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就是你的自己的方法,然后就是执行你的方法了

这样就遍历你数组并用你的方法做了事情
   
0 请登录后投票
时间:2007-07-31
campaign 写道
基本的原理这是样的,首先会调用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就是你的自己的方法,然后就是执行你的方法了

这样就遍历你数组并用你的方法做了事情
谢谢,基本明白了,可是Array中的flatten有什么用呢,应该如何调用,还有就是三楼的问题还不是太明白
   
0 请登录后投票
时间: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);
});
这一段代码是如何调用的?
   
0 请登录后投票
时间: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
   
0 请登录后投票
时间: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()功能是一样的。
   
0 请登录后投票
论坛首页 AJAX版 JavaScript

跳转论坛:
JavaEye推荐