mirror of https://github.com/EasyDarwin/EasyDarwin
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
2.8 KiB
96 lines
2.8 KiB
// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys |
|
if (!Object.keys) { |
|
Object.keys = (function () { |
|
'use strict'; |
|
var hasOwnProperty = Object.prototype.hasOwnProperty, |
|
hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'), |
|
dontEnums = [ |
|
'toString', |
|
'toLocaleString', |
|
'valueOf', |
|
'hasOwnProperty', |
|
'isPrototypeOf', |
|
'propertyIsEnumerable', |
|
'constructor' |
|
], |
|
dontEnumsLength = dontEnums.length; |
|
|
|
return function (obj) { |
|
if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) { |
|
throw new TypeError('Object.keys called on non-object'); |
|
} |
|
|
|
var result = [], prop, i; |
|
|
|
for (prop in obj) { |
|
if (hasOwnProperty.call(obj, prop)) { |
|
result.push(prop); |
|
} |
|
} |
|
|
|
if (hasDontEnumBug) { |
|
for (i = 0; i < dontEnumsLength; i++) { |
|
if (hasOwnProperty.call(obj, dontEnums[i])) { |
|
result.push(dontEnums[i]); |
|
} |
|
} |
|
} |
|
return result; |
|
}; |
|
}()); |
|
} |
|
|
|
//Production steps of ECMA-262, Edition 5, 15.4.4.18 |
|
//Reference: http://es5.github.com/#x15.4.4.18 |
|
if (!Array.prototype.forEach) { |
|
Array.prototype.forEach = function (callback, thisArg) { |
|
var T, k; |
|
|
|
if (this == null) { |
|
throw new TypeError(' this is null or not defined'); |
|
} |
|
|
|
// 1. Let O be the result of calling ToObject passing the |this| value as the argument. |
|
var O = Object(this); |
|
|
|
// 2. Let lenValue be the result of calling the Get internal method of O with the argument "length". |
|
// 3. Let len be ToUint32(lenValue). |
|
var len = O.length >>> 0; |
|
|
|
// 4. If IsCallable(callback) is false, throw a TypeError exception. |
|
// See: http://es5.github.com/#x9.11 |
|
if (typeof callback !== "function") { |
|
throw new TypeError(callback + " is not a function"); |
|
} |
|
|
|
// 5. If thisArg was supplied, let T be thisArg; else let T be undefined. |
|
if (arguments.length > 1) { |
|
T = thisArg; |
|
} |
|
|
|
// 6. Let k be 0 |
|
k = 0; |
|
|
|
// 7. Repeat, while k < len |
|
while (k < len) { |
|
var kValue; |
|
|
|
// a. Let Pk be ToString(k). |
|
// This is implicit for LHS operands of the in operator |
|
// b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk. |
|
// This step can be combined with c |
|
// c. If kPresent is true, then |
|
if (k in O) { |
|
// i. Let kValue be the result of calling the Get internal method of O with argument Pk. |
|
kValue = O[k]; |
|
|
|
// ii. Call the Call internal method of callback with T as the this value and |
|
// argument list containing kValue, k, and O. |
|
callback.call(T, kValue, k, O); |
|
} |
|
// d. Increase k by 1. |
|
k++; |
|
} |
|
// 8. return undefined |
|
}; |
|
}
|
|
|