该函数是判断一个对象是否是
plain object
,plain Object
指的是以字面量方式、new Object
方式或者Object.create(null)
方式生成的对象。
$isPlainObject (obj) {
var proto, Ctor;
// Detect obvious negatives
// 调用Object原型对象的toString方法,plain object结果为[object Object]
if ( !obj || Object.prototype.toString.call( obj ) !== '[object Object]' ) {
return false;
}
proto = Object.getPrototypeOf( obj );
// 验证Object.create(null)方式生成的对象
if ( !proto ) {
return true;
}
// 通过全局Object函数生成的对象:先获取prototype中的constructor构造函数,判断constructor构造函数的源代码是否和Object严格相等
Ctor = Object.prototype.hasOwnProperty.call( proto, 'constructor' ) && proto.constructor;
return typeof Ctor === 'function' && Object.prototype.hasOwnProperty.toString.call( Ctor ) === Object.prototype.hasOwnProperty.toString.call(Object);
}
其中Object.prototype.hasOwnProperty.toString
是为了获取函数类型的toString
方法,他被重写了,返回值是一个表示当前函数源代码的字符串。