对jQuery.isPlainObject()的理解
功能:判断对象否为纯粹的对象字面量
说明:对于通过字面量定义的对象和new Object的对象返回true,new Object时传参数的返回false
理解:
1、什么是字面量?
在编程语言中,字面量是一种表示值的记法。
例如:'some string',它就是一个字符串字面量(sring literal) ,
当然如:5、true和false、null,它们也是Javascript字面量对象。
此外Javascript还支持
对象字面量{firstname:'jone',lastname:'doe'};
数组字面量[1,3,4,5,6];
和函数字面量function(){return true};
比较详细的文章请见:http://www.wxwdesign.cn/article/skills/javascript_Literals.htm
2、hasOwnProperty和函数的调用方式
hasOwnProperty = Object.prototype.hasOwnProperty, (见jQuery.1.4.2 第69行)
Object.hasOwnProperty(property) //判断对象是否有某个特定的属性。必须用字符串指定该属性。(例如,o.hasOwnProperty("name"))
所以在jQuery.isPlainObject()函数内部出现的hasOwnProperty相当于对以上方法的调用
另外需要说下函数的call和apply的调用方法:
hasOwnProperty.call(obj,'name') 等同于obj.hasOwnProperty('name')
3、最后来分析下这个jQuery.isPlainObject()是如何实现功能的
function isPlainObject(obj){ //判断是否非window和DOM对象的对象, if ( !obj || obj.toString() !== "[object Object]" || obj.nodeType || obj.setInterval ) { return false; } //constructor是对创建对象的函数的引用(指针)。对于 Object 对象,该指针指向原始的 Object() 函数 //判断obj是否具有isPrototypeOf属性,isPrototypeOf是挂在Object.prototype上的。通过字面量或自定义类(构造器)创建的对象都会继承该属性方法 if ( obj.constructor && !obj.hasOwnProperty("constructor") && !obj.constructor.prototype.hasOwnProperty("isPrototypeOf") ) { return false; } var key; for ( key in obj ) {} return key === undefined || obj.hasOwnProperty(key); }
参考文章:http://snandy.javaeye.com/blog/663192 http://www.javaeye.com/topic/663245