2016-05-03 30 views
4

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

コメントがあり、その後特別ではない、他の小道具のためにコンストラクタの_.has(obj, prop) && !_.contains(keys, prop)が、prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop))を使用し、Constrcutor is a special caseを言います。

私はconstrcutorprop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop))を使用しようとしました。その後、npm run testすべてがOKだった。

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

ので、なぜunderscore御馳走constrcutor特別な?

_.has(obj, prop)prop in obj && obj[prop] !== proto[prop]の間に違いがありますか?

答えて

4

git blameを使用すると、「Fix IE non-enumerable properties」というメッセージが表示され、added in a commitでした。そこから

、もう少し早く、それはIE 8でこのバグを修正することであることが明らかになったと開削:IE8 property enumeration of replaced built-in properties (e.g. `toString`)

+0

プラスソース歴史やチェックインコメントへ行くための1。疑問があるときは、ルーク元に行ってください。 – jfriend00

+0

しかし、なぜ 'toString'は特別なのでしょうか? – codefalling

+0

または、 '_has(obj、prop)'と 'obj && obj [prop]のpropとの違いはありますか?== proto [prop]'? – codefalling

関連する問題