问题找到了var Hash = {
  _each: function(iterator) {
    for (key in this) {    //这里  如果key是 "member",value将得到一个函数对象,而不是期望的值1 
      var value = this[key];       
    //所以下面这句将被执行
     if (typeof value == 'function' )   continue;

      var pair = [key, value];
      pair.key = key;
      pair.value = value;
      iterator(pair);
    }
  },
member 是Enumerable的一个方法Object.extend(Enumerable, {
  map:     Enumerable.collect,
  find:    Enumerable.detect,
  select:  Enumerable.findAll,
  member:  Enumerable.include,
  entries: Enumerable.toArray
});而他,则把这个方法塞给了哈希对象function $H(object) {
  var hash = Object.extend({}, object || {});
  Object.extend(hash, Enumerable);
  Object.extend(hash, Hash);
  return hash;
}

解决方案 »

  1.   

    member是Enumerable对象的成员,会在这里被改写:
    function $H(object) {
      var hash = Object.extend({}, object || {});
      Object.extend(hash, Enumerable); // member属性被Enumerable对同名属性的重写了
      Object.extend(hash, Hash);
      return hash;
    }
    return之前加个断点可以看到member的属性是:
    hash.member
    {...}
        bindAsEventListener: {...}
        bind: {...}
      

  2.   

    不要用这些关键字就可以了:
    Enumerable
    {...}
        each: {...}
        all: {...}
        any: {...}
        collect: {...}
        detect: {...}
        findAll: {...}
        grep: {...}
        include: {...}
        inject: {...}
        invoke: {...}
        max: {...}
        min: {...}
        partition: {...}
        pluck: {...}
        reject: {...}
        sortBy: {...}
        toArray: {...}
        zip: {...}
        inspect: {...}
        map: {...}
        find: {...}
        select: {...}
        member: {...}
        entries: {...}