对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

posted @ 2010-05-12 13:09  aaaxawefasdf  阅读(4830)  评论(4编辑  收藏  举报