`
flyingis
  • 浏览: 290694 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多
    作者: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函数没有预先定义的类型。
分享到:
评论

相关推荐

    应用java反射机制打印一个对象.docx

    应用java反射机制打印一个对象.docx

    JavaScript王者归来part.1 总数2

     7.2.3 反射机制--枚举对象属性   7.3 对象的构造   7.3.1 构造函数--一个双精度浮点数封装类的例子   7.3.2 缺省构造和拷贝构造   7.3.3 对象常量   7.4 对象的销毁和存储单元的回收   7.5 JavaScript...

    JavaScript语言精粹

    在《JavaScript语言精粹》中,您将会发现一门美丽的、优雅的、轻量级的和非常富有表现力的语言,它使您创建高效的代码,不管您编写代码的目的是管理对象库还是仅仅使Ajax运行得更快。如果您为web开发站点或应用程序...

    typeserializer:真棒序列化反序列化器,用于javascript对象

    javascript对象的序列化器/反序列化器 目录 自定义序列化器 安装 使用npm安装: $ npm install typeserializer --save 您还需要安装反射元数据填充程序: $ npm install reflect-metadata --save 将reflect-...

    猎头java技术型。熟练掌握JAVA面向对象编程语言

    熟练掌握JAVA面向对象编程语言,有良好的编码习惯 熟悉常用的JavaAPI,包括多线程、IO、Socket、JDBC、XML、反射等 熟练使用HTML、CSS、JavaScript、JQuery,并了解Ajax 熟练使用JSP、Servlet、javaBean进行web应用...

    Web应用安全:DOM型XSS.pptx

    DOM型XSS 4 DOM型XSS防御 3 DOM型XSS原理分析 2 DOM型XSS简介 1 DOM 5 反射型与存储型与DOM型的对比 ...dom就是一个树状的模型,你可以编写Javascript代码根据dom一层一层的节点,去遍历/获取/修改对应的节点,对象,

    狂神说Java 笔记,java入门,docker ,spring 全家桶,redis , mysql , vue , javascript ,htm5, css

    6、JavaSE:面向对象.pdf 7、JavaSE:异常机制.pdf 8、JavaSE:常用类.pdf 9、JavaSE:集合框架.pdf 10、JavaSE:IO流.pdf 11、JavaSE:多线程.pdf 12、JavaSE:网络编程.pdf 13、JavaSE:Gui编程.pdf 14、...

    达内java培训目录

    熟练掌握JavaScript对象对象封装技巧,为后续的JavaScript学习打下坚实的基础。 Servlet/JSP Servlet生命周期及Servlet服务器、Tomcat部署配置、JSP语法、自定义标记、JSTL和EL表达式、JSP 新特性、Java Web 设计...

    算法实践(JavaScript & Java),排序,查找、树、两指针、动态规划等.zip

    动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛的适用范围,在企业级应用、互联网服务、移动开发等领域均扮演着举足轻重的...

    【卷一/共两卷】AJAX实战pdf高清版90M

    4.5.1 JavaScript对象的反射 4.5.2 处理数组和对象 4.5.3 添加控制器 4.6 小结 4.7 资源 第5章 服务器的角色 5.1 与服务器配合工作 5.2 编写服务器端代码 5.2.1 流行的买现语言 5.2.2 N层架构 5.2.3 维护客户端和...

    值类型与引用类型理论内容.part01.rar

    OOAD&UML (24课时) 讲授面向对象的分析设计方法、UML 语法及Rational Rose/MS Visio 工具的使用 和VSS的使用。 掌握面向对象的建模、分析、设计和实施方法.学习UML 建模语言和 Rational Rose /MS Visio ...

    中美 IT 培训 C# Asp.net 笔记2

    (24课时) 讲授面向对象的分析设计方法、UML 语法及Rational Rose/MS Visio 工具的使用 和VSS的使用。 掌握面向对象的建模、分析、设计和实施方法.学习UML 建模语言和 Rational Rose /MS Visio 建模工具. 项目...

    值类型与引用类型理论内容.part05.rar

    OOAD&UML (24课时) 讲授面向对象的分析设计方法、UML 语法及Rational Rose/MS Visio 工具的使用 和VSS的使用。 掌握面向对象的建模、分析、设计和实施方法.学习UML 建模语言和 Rational Rose /MS Visio ...

    中美 IT 培训 C# Asp.net 全套笔记1

    (24课时) 讲授面向对象的分析设计方法、UML 语法及Rational Rose/MS Visio 工具的使用 和VSS的使用。 掌握面向对象的建模、分析、设计和实施方法.学习UML 建模语言和 Rational Rose /MS Visio 建模工具. 项目...

    中美 IT 培训 C# Asp.net 笔记3

    (24课时) 讲授面向对象的分析设计方法、UML 语法及Rational Rose/MS Visio 工具的使用 和VSS的使用。 掌握面向对象的建模、分析、设计和实施方法.学习UML 建模语言和 Rational Rose /MS Visio 建模工具. 项目...

    基于Qt的不围棋(nogo)单机对战平台,包含基于MCTS的AI对战Bot.zip

    Qt Meta-Object System(元对象系统)是Qt框架的一个重要特性,它引入了元对象编译器(moc),用于在编译时生成额外的代码以支持对象间通信、反射、动态属性绑定等高级功能。 Signal & Slot机制是Qt中实现对象间...

    基于Qt的P2P聊天软件实现,主要由多个聊天客户端和一个中心注册服务器组成。.zip

    Qt Meta-Object System(元对象系统)是Qt框架的一个重要特性,它引入了元对象编译器(moc),用于在编译时生成额外的代码以支持对象间通信、反射、动态属性绑定等高级功能。 Signal & Slot机制是Qt中实现对象间...

    基于Qt QGraphicsView的简易画图软件.zip

    Qt Meta-Object System(元对象系统)是Qt框架的一个重要特性,它引入了元对象编译器(moc),用于在编译时生成额外的代码以支持对象间通信、反射、动态属性绑定等高级功能。 Signal & Slot机制是Qt中实现对象间...

    基于Qt Creator实现中国象棋人机对战, c++实现.zip

    Qt Meta-Object System(元对象系统)是Qt框架的一个重要特性,它引入了元对象编译器(moc),用于在编译时生成额外的代码以支持对象间通信、反射、动态属性绑定等高级功能。 Signal & Slot机制是Qt中实现对象间...

    基于Qt编写的音乐播放器,界面由QML编写,网络和文件由C++实现,能够搜索和播放在线歌曲。.zip

    Qt Meta-Object System(元对象系统)是Qt框架的一个重要特性,它引入了元对象编译器(moc),用于在编译时生成额外的代码以支持对象间通信、反射、动态属性绑定等高级功能。 Signal & Slot机制是Qt中实现对象间...

Global site tag (gtag.js) - Google Analytics