Flyingis
Talking and thinking freely !
Flying in the world of GIS !
BlogJava
|
首页
|
发新随笔
|
发新文章
|
联系
|
聚合
|
管理
随笔:156 文章:16 评论:545 引用:0
JavaScript 对象的反射及应用
作者:
Flyingis
Java和.NET都有着比较完善的反射机制,用来处理未知的对象并获取它们的属性和方法。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对象意义不大。
利用JavaScript的反射,我们可以编写一个函数来检查对象是否有一个特定名称的函数,然后利用该函数进行计算,以此在JavaScript中实现接口的功能,为在Ajax中使用设计模式奠定基础。
//
this.getWeight和this["getWeight"]意义相同
//
判断对象是否存在指定名称的函数
Object.prototype.hasFunc
=
function
(func)
{
return
this
&&
this
[func]
&&
this
[func]
instanceof
Function;
}
function
hasWeight(obj)
{
return
obj.hasFunc(
"
getWeight
"
);
}
//
判断参数是否为数值类型
function
isNum(param)
{
return
parseFloat(param)
!=
NaN;
}
//
计算两个对象的重量
function
calWeight(obj1, obj2)
{
var
total
=
null
;
if
(hasWeight(obj1)
&&
hasWeight(obj2))
{
var
w1
=
obj1.getWeight();
var
w2
=
obj2.getWeight();
if
(isNum(w1)
&&
isNum(w2))
{
total
=
parseFloat(w1)
+
parseFloat(w2);
}
}
return
total;
}
calWeight先判断两个对象是否均存在getWeight()函数,然后检查getWeight()计算结果是否为数值类型,最后进行数值相加返回计算结果。需要注意的是,parseFloat(param)函数能够除去param中非数字部分,如果param=16pm,parseFloat(16pm)得到的结果是16。如果不使用parseFloat(param)函数对getWeight()计算结果进行检验,那么会带来安全性的问题,这种情况下可以将对象的getWeight()设计为返回字符串或其他类型,在调用它之前我们是不知道JavaScript函数的返回类型的,因为JavaScript函数没有预先定义的类型。
发表于 2006-09-12 18:50
Flyingis
阅读(3215)
评论(5)
编辑
收藏
所属分类:
Web 客户端技术
评论
#
re: JavaScript 对象的反射及应用
你好,有个疑问---
"parseFloat(param) != NaN"
可以直接这样比较吗? 好像要利用 isNaN()函数吧?
#
re: JavaScript 对象的反射及应用
@飞飞
NaN就是指not a number,可以用来直接和变量比较。isNaN()是判断函数,上面例子可以写成:
"parseFloat(param).isNaN() == false"。
#
re: JavaScript 对象的反射及应用
这就叫多此一举了,何不直接这样呢:
function isNum(param) {
return !isNaN(parseFloat(param));
}
顺便说一下,obj.property的值不但可以是null,false,0,也可以是undefined。这种情况下这个property也是存在的:
var o={};
o.a=undefined;
for(var i in o) alert(typeof(o[i])=="undefined")
#
re: JavaScript 对象的反射及应用[未登录]
useless
#
re: JavaScript 对象的反射及应用
没用
新闻频道
新用户注册
刷新评论列表
标题
姓名
主页
验证码
*
内容(请不要发表任何与政治相关的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
成果网帮您增加网站收入
相关链接:
网站导航:
博客园
BlogJava
博客生活
IT博客网
C++博客
PHP博客
博客园社区
管理博客
教师博客
天文博客
汽车博客
足球博客
股票博客
电子博客
管理
相关文章:
[DWR文档] WEB-INF 参考
DWR 中文文档
用 JavaScript 玩转 DOM Level 1
[翻译] 如何在 JavaScript 中实现拖放(下)
[翻译] 如何在 JavaScript 中实现拖放(中)
[翻译] 如何在 JavaScript 中实现拖放(上)
JavaScript 随笔汇集
[翻译] "this" of JavaScript
JavaScript 对象的反射及应用
使用 JSON 创建对象
<
2006年9月
>
日
一
二
三
四
五
六
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
公告
Flyingis
博客空间内所有文章除特别声明为[转载],均为作者的学习心得和原创作品。如要转载,请注明作者名
flyingis及原文地址
联系方式
----
博客订阅
----
Google 广告
----
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(28)
给我留言
查看公开留言
查看私人留言
我参与的团队
架构师之家(0/0)
WebGIS开发设计组(0/0)
随笔分类
Algorithm(4)
(rss)
ArcEngine(9)
(rss)
ArcGIS Server(5)
(rss)
ArcIMS(7)
(rss)
ArcSDE(2)
(rss)
Diary(22)
(rss)
Eclipse Plugin(1)
(rss)
GIS-GPS-RS(28)
(rss)
Hibernate(6)
(rss)
JavaSE(28)
(rss)
Linux | Unix 技术(5)
(rss)
Web 客户端技术(24)
(rss)
Web 框架与开发(11)
(rss)
其他开源(3)
(rss)
架构与设计(8)
(rss)
随笔档案
2008年4月 (1)
2007年12月 (2)
2007年10月 (2)
2007年9月 (4)
2007年8月 (3)
2007年7月 (2)
2007年6月 (4)
2007年5月 (2)
2007年4月 (8)
2007年3月 (4)
2007年1月 (4)
2006年12月 (2)
2006年11月 (7)
2006年10月 (6)
2006年9月 (11)
2006年8月 (5)
2006年7月 (8)
2006年6月 (6)
2006年5月 (3)
2006年4月 (7)
2006年3月 (9)
2006年2月 (5)
2006年1月 (11)
2005年12月 (16)
2005年11月 (19)
2005年10月 (5)
文章分类
Health(1)
(rss)
Life(4)
(rss)
Recycle Bin(4)
(rss)
Technology(7)
(rss)
新闻档案
2006年10月 (1)
.Net 技术
ASP.net
(rss)
Ajax Technology
Ajaxian
(rss)
AjaxPatterns
Ajax中国
(rss)
ASP.Net Ajax
(rss)
Cross Browser
dp.SyntaxHighlighter
DWR
dynarch.com
(rss)
JavaScript Weblog
(rss)
Prototype
Rico
script.aculo.us
SoftComplex
WebFX
Eclipse Technology
Eclipse
Eclipsepowered
EclipseWorld
ESRI Technology
ESRI
(rss)
ESRI Developer Network
ESRI 中国
(rss)
ESRI 中国社区
GIS Technology
EOGEO
FreeGIS
GISuser.com
OGC
(rss)
OSGeo
uDig
Java Technology
Dev2Dev
(rss)
IBM developerWorks(CN)
IBM developerWorks(EN)
InfoQ
InfoQ in China
JavaEye
(rss)
Matrix
Openfans
(rss)
TheServerSide
(rss)
Linux Technology
LinuxSir
Ubuntu
中国Linux公社
Open Source
Apache
PostgreSQL
(rss)
SourceForge
个人博客
Flyingis in 3sNews
(rss)
Flyingis in cnblogs
(rss)
Flyingis in JavaEye
(rss)
精彩博客(技术类)
Carlwave-陆飞
(rss)
dudu
(rss)
emu
(rss)
Java Tang
(rss)
pesome
(rss)
sinoly
(rss)
zkjbeyond
(rss)
天狼
(rss)
姜利阳
(rss)
浩淼的天空
(rss)
蓝色森林
(rss)
马维峰
(rss)
精彩博客(非技术)
摄影博客-抓拍城市
(rss)
搜索
积分与排名
积分 - 314202
排名 - 13
最新评论
1. re: 小议final关键字
夯实基础,势在必行!
--Robert Hamming
2. re: 在Linux下安装JDK及环境设置
logout是为了让环境变量生效,source或切换用户就行。
--Flyingis
3. re: ArcGIS Server 开发系列(一)--编程框架总览
是发在博客上的系列文章
http://flyingis.cnblogs.com
--Flyingis
4. re: shapefile 和 MapGIS 文件格式之间的转换
相对完善的转换软件会有一定市场,现在用在哪些行业了?
--Flyingis
5. re: shapefile 和 MapGIS 文件格式之间的转换
评论内容较长,点击标题查看
--eeleo
阅读排行榜
1. JavaScript 调试工具(10693)
2. 在Linux下安装JDK及环境设置(10510)
3. ArcIMS 体系结构(6558)
4. DWR 中文文档(6328)
5. [翻译] 如何在 JavaScript 中实现拖放(上)(5187)
6. Hibernate学习心得--性能优化(4604)
7. [翻译] 如何在 JavaScript 中实现拖放(下)(4101)
8. 了解 Ajax 框架--充电开始(4053)
9. 正则表达式--JavaScript 实现基础(3955)
10. Java接口特性学习(3782)
11. IntelliJ IDEA 5.1 初步感受 + crack(3740)
12. ArcIMS 连接器--.NET Link 使用方法(3693)
13. [翻译] 如何在 JavaScript 中实现拖放(中)(3593)
14. 用 JavaScript 玩转 DOM Level 1(3550)
15. 测试你电脑功率的大小(3429)
评论排行榜
1. wallop 和orkut 的差异(143)
2. ArcIMS 连接器--.NET Link 使用方法(70)
3. IntelliJ IDEA 5.1 初步感受 + crack(16)
4. ArcIMS 体系结构(12)
5. [翻译] 如何在 JavaScript 中实现拖放(下)(11)