| 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; |