63 lines
1.5 KiB
JavaScript
63 lines
1.5 KiB
JavaScript
(function () {
|
|
"use strict";
|
|
|
|
// modified from https://github.com/kriskowal/es5-shim
|
|
var has = Object.prototype.hasOwnProperty,
|
|
toString = Object.prototype.toString,
|
|
forEach = require('./foreach'),
|
|
isArgs = require('./isArguments'),
|
|
hasDontEnumBug = !({'toString': null}).propertyIsEnumerable('toString'),
|
|
hasProtoEnumBug = (function () {}).propertyIsEnumerable('prototype'),
|
|
dontEnums = [
|
|
"toString",
|
|
"toLocaleString",
|
|
"valueOf",
|
|
"hasOwnProperty",
|
|
"isPrototypeOf",
|
|
"propertyIsEnumerable",
|
|
"constructor"
|
|
],
|
|
keysShim;
|
|
|
|
keysShim = function keys(object) {
|
|
var isObject = object !== null && typeof object === 'object',
|
|
isFunction = toString.call(object) === '[object Function]',
|
|
isArguments = isArgs(object),
|
|
theKeys = [];
|
|
|
|
if (!isObject && !isFunction && !isArguments) {
|
|
throw new TypeError("Object.keys called on a non-object");
|
|
}
|
|
|
|
if (isArguments) {
|
|
forEach(object, function (value) {
|
|
theKeys.push(value);
|
|
});
|
|
} else {
|
|
var name,
|
|
skipProto = hasProtoEnumBug && isFunction;
|
|
|
|
for (name in object) {
|
|
if (!(skipProto && name === 'prototype') && has.call(object, name)) {
|
|
theKeys.push(name);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (hasDontEnumBug) {
|
|
var ctor = object.constructor,
|
|
skipConstructor = ctor && ctor.prototype === object;
|
|
|
|
forEach(dontEnums, function (dontEnum) {
|
|
if (!(skipConstructor && dontEnum === 'constructor') && has.call(object, dontEnum)) {
|
|
theKeys.push(dontEnum);
|
|
}
|
|
});
|
|
}
|
|
return theKeys;
|
|
};
|
|
|
|
module.exports = keysShim;
|
|
}());
|
|
|