[摘录]JavaScript 对象的反射及应用

摘录地址:http://gis.javaeye.com/blog/24316

JavaScript 对象的反射及应用

关键字: JavaScript       

Java和.NET都有着比较完善的反射机制,用来处理未知的对象并获取它们的属性和方法。JavaScript虽然没有完善的反射体系,但在编程的时候还是可以通过代码设计来实现类似反射的基本功能。

检测一个JavaScript对象是否支持某种特定的属性或方法:

代码
  1. if (typeof(obj.property) != "undefined") {}  

这样声明比直接使用"if (obj.property)"来描述要更准确,因为当obj.property的值为false、0、null的时候,虽然该属性存在,但返回的结果却恰恰相反。

如果要求检测更详细一些,查看该属性的具体类型,可以用instanceof操作符:

代码
  1. if (obj instanceof PredefinedObj) {}  

但是,当对obj对象进行条件检测的时候,如果多种条件的对象类型存在继承关系,则需要注意代码的书写顺序,例如:

代码
  1. function() ExamineType(obj) {   
  2.   if (obj instanceof Object) {   
  3.     alert("An Object");   
  4.   else if (obj instanceof Array) {   
  5.     alert("An Array");   
  6.   }   
  7.   }   
  8. }  

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

利用JavaScript的反射,我们可以编写一个函数来检查对象是否有一个特定名称的函数,然后利用该函数进行计算,以此在JavaScript中实现接口的功能,为在Ajax中使用设计模式奠定基础。

代码
  1. //this.getWeight和this["getWeight"]意义相同   
  2. //判断对象是否存在指定名称的函数   
  3. Object.prototype.hasFunc = function(func) {   
  4.   return this && this[func] && this[func] instanceof Function;   
  5. }   
  6.   
  7. function hasWeight(obj) {   
  8.   return obj.hasFunc("getWeight");   
  9. }   
  10.   
  11. //判断参数是否为数值类型   
  12. function isNum(param) {   
  13.   return parseFloat(param) != NaN;   
  14. }   
  15.   
  16. //计算两个对象的重量   
  17. function calWeight(obj1, obj2) {   
  18.   var total = null;   
  19.   if (hasWeight(obj1) && hasWeight(obj2)) {   
  20.     var w1 = obj1.getWeight();   
  21.     var w2 = obj2.getWeight();   
  22.     if (isNum(w1) && isNum(w2)) {   
  23.       total = parseFloat(w1) + parseFloat(w2);   
  24.     }   
  25.   }   
  26.   return total;   
  27. }  

calWeight先判断两个对象是否均存在getWeight()函数,然后检查getWeight()计算结果是否为数值类型,最后进行数值相加返回计算结果。需要注意的是,parseFloat(param)函数能够除去param中非数字部分,如果param=16pm,parseFloat (16pm)得到的结果是16。如果不使用parseFloat(param)函数对getWeight()计算结果进行检验,那么会带来安全性的问题,这种情况下可以将对象的getWeight()设计为返回字符串或其他类型,在调用它之前我们是不知道JavaScript函数的返回类型的,因为 JavaScript函数没有预先定义的类型。



欢迎大家访问我的个人网站 萌萌的IT人

posted on 2006-12-21 17:26 见酒就晕 阅读(290) 评论(0)  编辑  收藏 所属分类: HTML


只有注册用户登录后才能发表评论。


网站导航:
 
<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

导航

统计

常用链接

留言簿(3)

我参与的团队

随笔分类

随笔档案

文章分类

文章档案

收藏夹

BLOG

FRIENDS

LIFE

搜索

最新评论

阅读排行榜

评论排行榜