免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2263 | 回复: 0
打印 上一主题 下一主题

jQuery isPlainObject [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-08-30 20:17 |只看该作者 |倒序浏览
jQuery isPlainObject

第一次看jQuery的源代码,转得好晕,苦逼的isPlainObject, 判断是否为纯粹的对象

  1. isPlainObject: function( obj ) {

  2. if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {//为空,节点,window对象,非object返回false;

  3. return false;

  4. }

  5. if ( obj.constructor &&

  6. !hasOwn.call(obj, "constructor") &&

  7. !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {//通过判断isPrototypeOf属性,检测原型链是否在Object.prototype,通过字面量或自定义类(构造器)创建的对象都会继承该属性方法,

  8. return false;

  9. }

  10.         var key;

  11. for ( key in obj ) {}

  12. return key === undefined || hasOwn.call( obj, key );

  13. }
复制代码
这个方法存在一些问题:

1.指定constructor


  function a(){this.xx=1;}

  var c=new a;

  c.constructor= Object;//!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ==false


  isPlainObject(c)//true


  如果a.prototype.cc=function(){};那么会出现两种情况:

    一、如果a没有定义任何方法或者属性,那么结果为所有浏览器都为为false;

    二、如果a定义了,如this.xx=1;那么IE会返回true,其他浏览器均返回false;

  出现这种情况在于var key;for ( key in obj ) {};列举obj属性的时候,IE和其他浏览器不同,IE会把扩展的方法先列举出来,而其他浏览器相反


2.Object.prototype.xx=1;

  c={};

  isPlainObject(c)//false

  这种情况是因为扩展了Object.prototype,但是IE下,如果c定义了某个属性或者方法c={"a":1},会返回true


3.document.getElementById;

  因为IE下会认为是object,所以isPlainObjcet(document.getElementById)会返回true,其他浏览器认为是function,返回false


4.location, history, screen
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP