手机版

超越jquery _ 01 _ isplayanobject分析与重构

时间:2021-10-22 来源:互联网 编辑:宝哥软件园 浏览:

isplayanoobject是Jquery1.4后提供的新方法,用于判断对象是否是纯粹的对象(通过'{}' 或者"新对象"创建的)。使用isplayanoobject首先我们来了解一下什么叫'纯粹的对象,简单的理解'纯粹的对象'指的就是由目标构造出来的对象。那哪些对象是由目标构造出来的呢。首当其充的肯定是由新对象()所构造出来的对象,注意:在目标后的括号里可没加任何东西。因为目标是所有'类'的根基,因此它有一些特殊的行为,如当调用新对象(3)的时候,会构造一个数字类型的对象新对象("")会构造一个线类型的对象。然后以{}这种形式定义的对象也属于'纯粹的对象。'{}'的实质就是新对象(),只是表现形形式不同。好,让我们来看一段代码:复制代码代码如下: var objStr=新对象("");警报(Objstr。建造师);//字符串警报(isplaynobject(Objstr));//false var objNum=new Object(3);警报(ObjNum。建造师);//号码提醒(isplaynobject(ObjNum));//false函数Person(){ } var Person=new Person();alert(isplayanoobject(person));//false var obj 01=new Object();' obj01.name='笨蛋的座右铭;alert(isplayanoobject(obj 01));//真正的警报(isplaynobject({ name : ')笨蛋的座右铭'}));//true isplaynobject源码分析以下代码为框架中的isplayanoobject的完整版本,注释已经很详尽了,我就不多说什么了。复制代码代码如下: var toString=对象。原型。toString,hasown属性=object。原型。拥有自己的财产;函数isplayanoobject(obj){//必须是对象。//因为IE,我们也要检查构造函数属性的存在。//确保数字正射影像图节点和窗口对象也不会通过//windows对象3360 ostring。调用(窗口): ie[对象]FF[对象窗口]chrome[窗口全局]safari[对象DOM窗口]//DOM节点3360 ostring。调用(# div 01): ie[对象]FF[对象窗口]chrome[对象全局]safari[对象DOM窗口]//结论:obj.nodeType || obj.setInterval主要是针对于工业管理学(工业工程)浏览器进行判断//注:历史、位置、导航器、屏幕的setInterval为未定义的if(!obj || toString.call(obj)!=='[对象对象]' | |对象。nodetype | | obj。set interval){ 0返回false} //非自己的构造函数属性必须是对象/除去自定义对象和内置对象的判断,如函数Person(){ } var p=new Person();字符串,数字if (obj.constructor //有构造器属性!hasOwnProperty.call(obj,' constructor') //并且构造器这个属性必须是在原型链中进行定义的!拥有自己的财产。呼叫(obj。构造函数。prototype,' is rototypeof ')//并且原型中有isPrototypeOf方法,一般只有目标的原型中才有这个方法){返回false} //先枚举自己的属性,这样加快速度,//如果最后一个是自己的,那么所有属性都是自己的。//针对于复杂类结构,如有继承./* //一个简单的测试函数动物(名字){ }函数人(名字,年龄){动物.呼叫(这个,名字);this.age=年龄;} var p=new Person('jxl ',20);for(p中的键){ alert(hasOwnProperty.call(p,key ))//true,false } */var key;for(obj中的键){ }返回键===undefined | | Hasownproperty。呼叫(obj,key);} 提出问题个人感觉这个实现比较复杂,而且有BUG。

简单的BUG、历史、位置、导航器、屏幕可以顺序通过isplayanoobject的检测返回没错。来看一个我的解决方案(修改BUG,简化): 复制代码代码如下:函数isplayanoobject(obj){ if(Objobeject。原型。tostring。调用(对象)=='[对象对象]'对象。构造函数===对象!hasOwnProperty.call(obj,' constructor '){ var key;for(obj中的键){ }返回键===undefined | | Hasownproperty。呼叫(obj,key);}返回false}还有BUG,而且是一个无解的BUG:复制代码代码如下:函数m(){ };原型构造函数=对象;//必杀obj=新m;alert(IsLainObject(obj));//真再来一个同理的: 复制代码代码如下:函数m(){ };m . prototype={ };obj=新m;alert(IsLainObject(obj));//真这个答案是无解的!解答无解本以为这个问题很好解决,结果深入后,发现这是一个无解的问题。原因如下:复制代码代码如下:函数person(){ };人。原型。构造器=对象;var person=新人;让我们来看一下人现在的状态

person及其构造函数Person之间的唯一联系是其原型链中的构造函数属性。现在我们主要根据对象实例的构造函数来判断它是否是‘纯对象’。如果我们指向对象,如图所示,那么人和人在代码中没有关系。正因为如此,在判断类型上存在问题。

版权声明:超越jquery _ 01 _ isplayanobject分析与重构是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。