| var baseGetTag = require('./_baseGetTag'), | |
|     getPrototype = require('./_getPrototype'), | |
|     isObjectLike = require('./isObjectLike'); | |
| 
 | |
| /** `Object#toString` result references. */ | |
| var objectTag = '[object Object]'; | |
| 
 | |
| /** Used for built-in method references. */ | |
| var funcProto = Function.prototype, | |
|     objectProto = Object.prototype; | |
| 
 | |
| /** Used to resolve the decompiled source of functions. */ | |
| var funcToString = funcProto.toString; | |
| 
 | |
| /** Used to check objects for own properties. */ | |
| var hasOwnProperty = objectProto.hasOwnProperty; | |
| 
 | |
| /** Used to infer the `Object` constructor. */ | |
| var objectCtorString = funcToString.call(Object); | |
| 
 | |
| /** | |
|  * Checks if `value` is a plain object, that is, an object created by the | |
|  * `Object` constructor or one with a `[[Prototype]]` of `null`. | |
|  * | |
|  * @static | |
|  * @memberOf _ | |
|  * @since 0.8.0 | |
|  * @category Lang | |
|  * @param {*} value The value to check. | |
|  * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. | |
|  * @example | |
|  * | |
|  * function Foo() { | |
|  *   this.a = 1; | |
|  * } | |
|  * | |
|  * _.isPlainObject(new Foo); | |
|  * // => false | |
|  * | |
|  * _.isPlainObject([1, 2, 3]); | |
|  * // => false | |
|  * | |
|  * _.isPlainObject({ 'x': 0, 'y': 0 }); | |
|  * // => true | |
|  * | |
|  * _.isPlainObject(Object.create(null)); | |
|  * // => true | |
|  */ | |
| function isPlainObject(value) { | |
|   if (!isObjectLike(value) || baseGetTag(value) != objectTag) { | |
|     return false; | |
|   } | |
|   var proto = getPrototype(value); | |
|   if (proto === null) { | |
|     return true; | |
|   } | |
|   var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor; | |
|   return typeof Ctor == 'function' && Ctor instanceof Ctor && | |
|     funcToString.call(Ctor) == objectCtorString; | |
| } | |
| 
 | |
| module.exports = isPlainObject;
 |