undersource.js源码中nonEnumerableProps函数作用

看undersource.js源码中nonEnumerableProps函数貌似是为了把对象中不可遍历的属性加入key返回,而源码注释中提到ie9以下枚举bug,测试过hasEnumBug值都是为false,那collectNonEnumProps函数就不会被执行了,其次~返回这些不可遍历的属性值应该没有什么用处吧~再者为什么要单独处理constructor属性,相关源码如下:

function collectNonEnumProps(obj, keys) {
    var nonEnumIdx = nonEnumerableProps.length;
    var constructor = obj.constructor;
    var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto;

    // Constructor is a special case.
    var prop = 'constructor';
    if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop);

    while (nonEnumIdx--) {
      prop = nonEnumerableProps[nonEnumIdx];
      if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) {
        keys.push(prop);
      }
    }
  }
阅读 3.1k
1 个回答

Underscore 源码中,hasEnumBug 的值来源于下面这句话,顺便把 noEnumerableProps 那句也贴出来

var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
                      'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];

在 IE8 中亲测结果为 true

clipboard.png

然后来看看通过 for ... in 循环在两个浏览器(IE8 和最新的 Chrominum 核心浏览器)中的效果,也就是 hasEnumBugtruefalse 情况下的效果

clipboard.png

collectNonEnumProps 干的事情就是在 hasEnumBugtrue 的情况下,把那些不能枚举出来的对象属性(比如上例中的 toString)补充到 keys 中去。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题