上善若水
愿倾其毕生之功,高扬.NET旗帜
我不知道自己这么定义是不是准确,因为本身我对反射不怎么了解,只是知道通过反射可以获取一个类的方法和属性,惭愧,说这句话怎么也不像一个程序员!我这么定义这一个标题,可能对于我的需求而言,有点过大,但是还是这么写下来,只是给自己一个研究的问题,馒头总是要一口一口的吃!
需求:判断一个对象为Array
就是这么一个简单的需求,说不上什么反射,呵呵。
在网上查了一下资料,解决办法如下:
可以判断它的构造器是什么,进而判断它是Array还是Object!
<script>   
var o=new Array('10','25','50');   
if (o.constructor ==  Array)   
{   
  alert(
"Array");   
}
   
    
var   str="xxxxxxxxxxxxxx";   
if (str.constructor == String)   
{   
  alert(
"String");   
}
   
</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对象进行条件检测的时候,如果多种条件的对象类型存在继承关系,则需要注意代码的书写顺序,例如:

function() ExamineType(obj) 
{
  
if (obj instanceof Object) 
  
{
    alert(
"An Object");
  }

  
else if (obj instanceof Array) 
  
{
    alert(
"An Array");
  }

}

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

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

posted on 2007-07-12 15:06  小兔快跑  阅读(746)  评论(0编辑  收藏  举报