Code cleanup and removal of ctorByClass.

This commit is contained in:
John-David Dalton
2014-05-25 13:18:13 -07:00
parent 1812d557b6
commit 67f9c7e0f0

120
lodash.js
View File

@@ -130,38 +130,24 @@
weakMapClass = '[object WeakMap]'; weakMapClass = '[object WeakMap]';
var arrayBufferClass = '[object ArrayBuffer]', var arrayBufferClass = '[object ArrayBuffer]',
f32Class = '[object Float32Array]', float32Class = '[object Float32Array]',
f64Class = '[object Float64Array]', float64Class = '[object Float64Array]',
i8Class = '[object Int8Array]', int8Class = '[object Int8Array]',
i16Class = '[object Int16Array]', int16Class = '[object Int16Array]',
i32Class = '[object Int32Array]', int32Class = '[object Int32Array]',
u8Class = '[object Uint8Array]', uint8Class = '[object Uint8Array]',
u8cClass = '[object Uint8ClampedArray]', uint8ClampedClass = '[object Uint8ClampedArray]',
u16Class = '[object Uint16Array]', uint16Class = '[object Uint16Array]',
u32Class = '[object Uint32Array]'; uint32Class = '[object Uint32Array]';
/** Used to identify object classifications that `_.clone` supports */
var cloneableClasses = {};
cloneableClasses[argsClass] = cloneableClasses[arrayClass] =
cloneableClasses[arrayBufferClass] = cloneableClasses[boolClass] =
cloneableClasses[dateClass] = cloneableClasses[errorClass] =
cloneableClasses[f64Class] = cloneableClasses[i8Class] =
cloneableClasses[i16Class] = cloneableClasses[i32Class] =
cloneableClasses[numberClass] = cloneableClasses[objectClass] =
cloneableClasses[regexpClass] = cloneableClasses[stringClass] =
cloneableClasses[u8Class] = cloneableClasses[u8cClass] =
cloneableClasses[u16Class] = cloneableClasses[u32Class] = true;
cloneableClasses[funcClass] = cloneableClasses[mapClass] =
cloneableClasses[setClass] = cloneableClasses[weakMapClass] = false;
/** Used to identify object classifications that are treated like arrays */ /** Used to identify object classifications that are treated like arrays */
var arrayLikeClasses = {}; var arrayLikeClasses = {};
arrayLikeClasses[argsClass] = arrayLikeClasses[argsClass] =
arrayLikeClasses[arrayClass] = arrayLikeClasses[f32Class] = arrayLikeClasses[arrayClass] = arrayLikeClasses[float32Class] =
arrayLikeClasses[f64Class] = arrayLikeClasses[i8Class] = arrayLikeClasses[float64Class] = arrayLikeClasses[int8Class] =
arrayLikeClasses[i16Class] = arrayLikeClasses[i32Class] = arrayLikeClasses[int16Class] = arrayLikeClasses[int32Class] =
arrayLikeClasses[u8Class] = arrayLikeClasses[u8cClass] = arrayLikeClasses[uint8Class] = arrayLikeClasses[uint8ClampedClass] =
arrayLikeClasses[u16Class] = arrayLikeClasses[u32Class] = true; arrayLikeClasses[uint16Class] = arrayLikeClasses[uint32Class] = true;
arrayLikeClasses[arrayBufferClass] = arrayLikeClasses[boolClass] = arrayLikeClasses[arrayBufferClass] = arrayLikeClasses[boolClass] =
arrayLikeClasses[dateClass] = arrayLikeClasses[errorClass] = arrayLikeClasses[dateClass] = arrayLikeClasses[errorClass] =
arrayLikeClasses[funcClass] = arrayLikeClasses[mapClass] = arrayLikeClasses[funcClass] = arrayLikeClasses[mapClass] =
@@ -169,6 +155,20 @@
arrayLikeClasses[regexpClass] = arrayLikeClasses[setClass] = arrayLikeClasses[regexpClass] = arrayLikeClasses[setClass] =
arrayLikeClasses[stringClass] = arrayLikeClasses[weakMapClass] = false; arrayLikeClasses[stringClass] = arrayLikeClasses[weakMapClass] = false;
/** Used to identify object classifications that `_.clone` supports */
var cloneableClasses = {};
cloneableClasses[argsClass] = cloneableClasses[arrayClass] =
cloneableClasses[arrayBufferClass] = cloneableClasses[boolClass] =
cloneableClasses[dateClass] = cloneableClasses[errorClass] =
cloneableClasses[float64Class] = cloneableClasses[int8Class] =
cloneableClasses[int16Class] = cloneableClasses[int32Class] =
cloneableClasses[numberClass] = cloneableClasses[objectClass] =
cloneableClasses[regexpClass] = cloneableClasses[stringClass] =
cloneableClasses[uint8Class] = cloneableClasses[uint8ClampedClass] =
cloneableClasses[uint16Class] = cloneableClasses[uint32Class] = true;
cloneableClasses[funcClass] = cloneableClasses[mapClass] =
cloneableClasses[setClass] = cloneableClasses[weakMapClass] = false;
/** Used as an internal `_.debounce` options object by `_.throttle` */ /** Used as an internal `_.debounce` options object by `_.throttle` */
var debounceOptions = { var debounceOptions = {
'leading': false, 'leading': false,
@@ -683,17 +683,6 @@
nativeParseInt = context.parseInt, nativeParseInt = context.parseInt,
nativeRandom = Math.random; nativeRandom = Math.random;
/** Used to lookup built-in constructors by `[[Class]]` */
var ctorByClass = {};
ctorByClass[arrayClass] = Array;
ctorByClass[boolClass] = Boolean;
ctorByClass[dateClass] = Date;
ctorByClass[funcClass] = Function;
ctorByClass[objectClass] = Object;
ctorByClass[numberClass] = Number;
ctorByClass[regexpClass] = RegExp;
ctorByClass[stringClass] = String;
/** Used to avoid iterating over non-enumerable properties in IE < 9 */ /** Used to avoid iterating over non-enumerable properties in IE < 9 */
var nonEnumProps = {}; var nonEnumProps = {};
nonEnumProps[arrayClass] = nonEnumProps[dateClass] = nonEnumProps[numberClass] = { 'constructor': true, 'toLocaleString': true, 'toString': true, 'valueOf': true }; nonEnumProps[arrayClass] = nonEnumProps[dateClass] = nonEnumProps[numberClass] = { 'constructor': true, 'toLocaleString': true, 'toString': true, 'valueOf': true };
@@ -814,12 +803,12 @@
var support = lodash.support = {}; var support = lodash.support = {};
(function(x) { (function(x) {
var ctor = function() { this.x = 1; }, var Ctor = function() { this.x = 1; },
object = { '0': 1, 'length': 1 }, object = { '0': 1, 'length': 1 },
props = []; props = [];
ctor.prototype = { 'valueOf': 1, 'y': 1 }; Ctor.prototype = { 'valueOf': 1, 'y': 1 };
for (var key in new ctor) { props.push(key); } for (var key in new Ctor) { props.push(key); }
for (var argsKey in arguments) { } for (var argsKey in arguments) { }
for (var strKey in 'x') { } for (var strKey in 'x') { }
@@ -862,7 +851,7 @@
* @memberOf _.support * @memberOf _.support
* @type boolean * @type boolean
*/ */
support.enumPrototypes = propertyIsEnumerable.call(ctor, 'prototype'); support.enumPrototypes = propertyIsEnumerable.call(Ctor, 'prototype');
/** /**
* Detect if functions can be decompiled by `Function#toString` * Detect if functions can be decompiled by `Function#toString`
@@ -1230,29 +1219,32 @@
if (!cloneableClasses[className] || (!support.nodeClass && isNode(value))) { if (!cloneableClasses[className] || (!support.nodeClass && isNode(value))) {
return value; return value;
} }
var ctor = ctorByClass[className]; var Ctor = value.constructor;
if (className == objectClass && !(isFunction(Ctor) && (Ctor instanceof Ctor))) {
Ctor = Object;
}
switch (className) { switch (className) {
case arrayBufferClass: case arrayBufferClass:
return value.slice(); return value.slice();
case boolClass: case boolClass:
case dateClass: case dateClass:
return new ctor(+value); return new Ctor(+value);
case errorClass: case errorClass:
return new ctor(value.message); return new Ctor(value.message);
case f32Class: case f64Class: case float32Class: case float64Class:
case i8Class: case i16Class: case i32Class: case int8Class: case int16Class: case int32Class:
case u8Class: case u8cClass: case u16Class: case u32Class: case uint8Class: case uint8ClampedClass: case uint16Class: case uint32Class:
return value.subarray(0); return value.subarray(0);
case numberClass: case numberClass:
case stringClass: case stringClass:
return new ctor(value); return new Ctor(value);
case regexpClass: case regexpClass:
result = ctor(value.source, reFlags.exec(value)); result = Ctor(value.source, reFlags.exec(value));
result.lastIndex = value.lastIndex; result.lastIndex = value.lastIndex;
return result; return result;
} }
@@ -1271,7 +1263,7 @@
return stackB[length]; return stackB[length];
} }
} }
result = isArr ? ctor(value.length) : {}; result = isArr ? Ctor(value.length) : Ctor();
} }
else { else {
result = isArr ? slice(value) : baseAssign({}, value); result = isArr ? slice(value) : baseAssign({}, value);
@@ -2554,13 +2546,13 @@
* @returns {boolean} Returns `true` if `value` is a plain object, else `false`. * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
*/ */
function shimIsPlainObject(value) { function shimIsPlainObject(value) {
var ctor, var Ctor,
result; result;
// avoid non `Object` objects, `arguments` objects, and DOM elements // avoid non `Object` objects, `arguments` objects, and DOM elements
if (!(value && toString.call(value) == objectClass) || if (!(value && toString.call(value) == objectClass) ||
(!hasOwnProperty.call(value, 'constructor') && (!hasOwnProperty.call(value, 'constructor') &&
(ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor))) || (Ctor = value.constructor, isFunction(Ctor) && !(Ctor instanceof Ctor))) ||
(!support.argsClass && isArguments(value)) || (!support.argsClass && isArguments(value)) ||
(!support.nodeClass && isNode(value))) { (!support.nodeClass && isNode(value))) {
return false; return false;
@@ -6937,11 +6929,11 @@
* // => ['x', 'y'] (property order is not guaranteed across environments) * // => ['x', 'y'] (property order is not guaranteed across environments)
*/ */
var keys = !nativeKeys ? shimKeys : function(object) { var keys = !nativeKeys ? shimKeys : function(object) {
var ctor = object && object.constructor, var Ctor = object && object.constructor,
length = object ? object.length : 0; length = object ? object.length : 0;
if ((typeof length == 'number' && length > 0) || if ((typeof length == 'number' && length > 0) ||
(ctor && object === ctor.prototype)) { (Ctor && object === Ctor.prototype)) {
return shimKeys(object); return shimKeys(object);
} }
return isObject(object) ? nativeKeys(object) : []; return isObject(object) ? nativeKeys(object) : [];
@@ -6977,9 +6969,9 @@
(support.nonEnumArgs && isArguments(object))) && length) >>> 0; (support.nonEnumArgs && isArguments(object))) && length) >>> 0;
var keyIndex, var keyIndex,
ctor = object.constructor, Ctor = object.constructor,
index = -1, index = -1,
isProto = ctor && object === ctor.prototype, isProto = Ctor && object === Ctor.prototype,
maxIndex = length - 1, maxIndex = length - 1,
result = Array(length), result = Array(length),
skipIndexes = length > 0, skipIndexes = length > 0,
@@ -6989,6 +6981,10 @@
while (++index < length) { while (++index < length) {
result[index] = String(index); result[index] = String(index);
} }
// Lo-Dash skips the `constructor` property when it infers it's iterating
// over a `prototype` object because IE < 9 can't set the `[[Enumerable]]`
// attribute of an existing property and the `constructor` property of a
// prototype defaults to non-enumerable.
for (var key in object) { for (var key in object) {
if (!(isProto && key == 'constructor') && if (!(isProto && key == 'constructor') &&
!(skipProto && key == 'prototype') && !(skipProto && key == 'prototype') &&
@@ -6997,10 +6993,6 @@
result.push(key); result.push(key);
} }
} }
// Lo-Dash skips the `constructor` property when it infers it's iterating
// over a `prototype` object because IE < 9 can't set the `[[Enumerable]]`
// attribute of an existing property and the `constructor` property of a
// prototype defaults to non-enumerable.
if (support.nonEnumShadows && object !== objectProto) { if (support.nonEnumShadows && object !== objectProto) {
index = -1; index = -1;
length = shadowedProps.length; length = shadowedProps.length;
@@ -7262,8 +7254,8 @@
accumulator = []; accumulator = [];
} else { } else {
if (isObject(object)) { if (isObject(object)) {
var ctor = object.constructor, var Ctor = object.constructor,
proto = ctor && ctor.prototype; proto = Ctor && Ctor.prototype;
} }
accumulator = baseCreate(proto); accumulator = baseCreate(proto);
} }