您的位置:首页 > Web前端 > JavaScript

浅谈Javascript的反射机制

2007-07-12 15:06 621 查看
我不知道自己这么定义是不是准确,因为本身我对反射不怎么了解,只是知道通过反射可以获取一个类的方法和属性,惭愧,说这句话怎么也不像一个程序员!我这么定义这一个标题,可能对于我的需求而言,有点过大,但是还是这么写下来,只是给自己一个研究的问题,馒头总是要一口一口的吃!
需求:判断一个对象为Array
就是这么一个简单的需求,说不上什么反射,呵呵。
在网上查了一下资料,解决办法如下:
可以判断它的构造器是什么,进而判断它是Array还是Object!

<script>
var o=new Array('10','25','50');
if (o.constructor == Array)

var str="xxxxxxxxxxxxxx";
if (str.constructor == 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 实现继承》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: