浅谈Javascript的反射机制

我不知道自己这么定义是不是准确,因为本身我对反射不怎么了解,只是知道通过反射可以获取一个类的方法和属性,惭愧,说这句话怎么也不像一个程序员!我这么定义这一个标题,可能对于我的需求而言,有点过大,但是还是这么写下来,只是给自己一个研究的问题,馒头总是要一口一口的吃!
需求:判断一个对象为Array
就是这么一个简单的需求,说不上什么反射,呵呵。
在网上查了一下资料,解决办法如下:
可以判断它的构造器是什么,进而判断它是Array还是Object!
None.gif < script >    
None.gif
var  o = new  Array(' 10 ',' 25 ',' 50 ');   
None.gif
if  (o.constructor  ==   Array)   
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {   
InBlock.gif  alert(
"Array");   
ExpandedBlockEnd.gif}
   
None.gif    
None.gif
var    str = " xxxxxxxxxxxxxx " ;   
None.gif
if  (str.constructor  ==  String)   
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {   
InBlock.gif  alert(
"String");   
ExpandedBlockEnd.gif}
   
None.gif
</ script >

在js帮助中,Contructor解释如下:
constructor 属性
描述
表示创建对象的函数。
语法
object.constructor
必需的 object 参数是对象或函数的名称。

说明
constructor 属性是所有具有 prototype 的对象的成员。它们包括除 Global 和 Math 对象以外的所有 JScript 固有对象。constructor 属性保存了对构造特定对象实例的函数的引用。 例如:
x = new String("Hi");
if (x.constructor == String)
    // 进行处理(条件为真)


function MyFunc
{
    // 函数体。
}

y = new MyFunc;
if (y.constructor == MyFunc)
   // 进行处理(条件为真)

这里再引用flyingis的JavaScript 对象的反射及应用中的几句话:
检测一个JavaScript对象是否支持某种特定的属性或方法:
if (typeof(obj.property) != "undefined") {}
这样声明比直接使用"if (obj.property)"来描述要更准确,因为当obj.property的值为false、0、null的时候,虽然该属性存在,但返回的结果却恰恰相反。

如果要求检测更详细一些,查看该属性的具体类型,可以用instanceof操作符:
if (obj instanceof PredefinedObj) {}
但是,当对obj对象进行条件检测的时候,如果多种条件的对象类型存在继承关系,则需要注意代码的书写顺序,例如:

None.gif function () ExamineType(obj) 
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif  
if (obj instanceof Object) 
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif    alert(
"An Object");
ExpandedSubBlockEnd.gif  }

InBlock.gif  
else if (obj instanceof Array) 
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif    alert(
"An Array");
ExpandedSubBlockEnd.gif  }

ExpandedBlockEnd.gif}

上述代码执行的结果会认为原为Array类型的obj是一个Object,因为Array本身就是从Object继承而来,显然,将对Array的检测放在前面会得到更精确的结果。因此,使用instanceof来判断对象类型,需要注意当两个对象存在继承关系的时候,应该关注检测顺序的问题,进一步我们可以想到,JSON创建的对象不是Object就是Array,使用instanceof来检测JSON对象意义不大。

这里再推荐一篇文章,希望大家能有点收获《AJAX的JavaScript的反射机制》《利用反射机制和prototype 实现继承》

转载于:https://www.cnblogs.com/lne818/archive/2007/07/12/815575.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值