Why is "constructor a special case"?

In underlining there is collectNonEnumProps :

var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
    'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'
];

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);
        }
    }
}

There is a comment Constrcutor is a special case, then use _.has(obj, prop) && !_.contains(keys, prop)for the constructor, but prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop))for other details that are not special .

I tried using prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop))for constrcutor. Then npm run testeverything was in order.

var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
    'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString', 'constructor'
];

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


    while (nonEnumIdx--) {
        prop = nonEnumerableProps[nonEnumIdx];
        if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) {
            keys.push(prop);
        }
    }
};

So why underscoretreat constrcutorspecial?

Or are there any differences between _.has(obj, prop)and prop in obj && obj[prop] !== proto[prop]?

+4
source share
1 answer

git wame , commit " IE ".

, , IE 8 : IE8 (,` toString`)

+4

All Articles