ember-cli-ajh
Version:
Command line tool for developing ambitious ember.js apps
71 lines (60 loc) • 1.84 kB
JavaScript
;
// modified from https://github.com/es-shims/es5-shim
var has = Object.prototype.hasOwnProperty;
var toString = Object.prototype.toString;
var isArgs = require('./isArguments');
var hasDontEnumBug = !({'toString': null}).propertyIsEnumerable('toString');
var hasProtoEnumBug = (function () {}).propertyIsEnumerable('prototype');
var dontEnums = [
"toString",
"toLocaleString",
"valueOf",
"hasOwnProperty",
"isPrototypeOf",
"propertyIsEnumerable",
"constructor"
];
var keysShim = function keys(object) {
var isObject = object !== null && typeof object === 'object';
var isFunction = toString.call(object) === '[object Function]';
var isArguments = isArgs(object);
var isString = isObject && toString.call(object) === '[object String]';
var theKeys = [];
if (!isObject && !isFunction && !isArguments) {
throw new TypeError("Object.keys called on a non-object");
}
var skipProto = hasProtoEnumBug && isFunction;
if (isString && object.length > 0 && !has.call(object, 0)) {
for (var i = 0; i < object.length; ++i) {
theKeys.push(String(i));
}
}
if (isArguments && object.length > 0) {
for (var j = 0; j < object.length; ++j) {
theKeys.push(String(j));
}
} else {
for (var name in object) {
if (!(skipProto && name === 'prototype') && has.call(object, name)) {
theKeys.push(String(name));
}
}
}
if (hasDontEnumBug) {
var ctor = object.constructor;
var skipConstructor = ctor && ctor.prototype === object;
for (var j = 0; j < dontEnums.length; ++j) {
if (!(skipConstructor && dontEnums[j] === 'constructor') && has.call(object, dontEnums[j])) {
theKeys.push(dontEnums[j]);
}
}
}
return theKeys;
};
keysShim.shim = function shimObjectKeys() {
if (!Object.keys) {
Object.keys = keysShim;
}
return Object.keys || keysShim;
};
module.exports = keysShim;