| /** |
| * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/> |
| * Build: `lodash modularize exports="node" -o ./compat/` |
| * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/> |
| * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE> |
| * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors |
| * Available under MIT license <http://lodash.com/license> |
| */ |
| var forIn = require('../objects/forIn'), |
| isArguments = require('../objects/isArguments'), |
| isFunction = require('../objects/isFunction'), |
| isNode = require('./isNode'), |
| support = require('../support'); |
| |
| /** `Object#toString` result shortcuts */ |
| var objectClass = '[object Object]'; |
| |
| /** Used for native method references */ |
| var objectProto = Object.prototype; |
| |
| /** Used to resolve the internal [[Class]] of values */ |
| var toString = objectProto.toString; |
| |
| /** Native method shortcuts */ |
| var hasOwnProperty = objectProto.hasOwnProperty; |
| |
| /** |
| * A fallback implementation of `isPlainObject` which checks if a given value |
| * is an object created by the `Object` constructor, assuming objects created |
| * by the `Object` constructor have no inherited enumerable properties and that |
| * there are no `Object.prototype` extensions. |
| * |
| * @private |
| * @param {*} value The value to check. |
| * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. |
| */ |
| function shimIsPlainObject(value) { |
| var ctor, |
| result; |
| |
| // avoid non Object objects, `arguments` objects, and DOM elements |
| if (!(value && toString.call(value) == objectClass) || |
| (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor)) || |
| (!support.argsClass && isArguments(value)) || |
| (!support.nodeClass && isNode(value))) { |
| return false; |
| } |
| // IE < 9 iterates inherited properties before own properties. If the first |
| // iterated property is an object's own property then there are no inherited |
| // enumerable properties. |
| if (support.ownLast) { |
| forIn(value, function(value, key, object) { |
| result = hasOwnProperty.call(object, key); |
| return false; |
| }); |
| return result !== false; |
| } |
| // In most environments an object's own properties are iterated before |
| // its inherited properties. If the last iterated property is an object's |
| // own property then there are no inherited enumerable properties. |
| forIn(value, function(value, key) { |
| result = key; |
| }); |
| return typeof result == 'undefined' || hasOwnProperty.call(value, result); |
| } |
| |
| module.exports = shimIsPlainObject; |