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