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函数没有预先定义的类型。
BlogJava上的链接:
http://www.blogjava.net/flyingis/archive/2006/09/12/69213.html
分享到:
相关推荐
JavaScript对象反射是一种机制,允许程序在运行时检查、修改和操作对象的属性。在JavaScript中,反射通常指的是通过Reflect API提供的方法来访问或修改对象的行为。本文将通过实例分析来探讨JavaScript对象反射的...
Frida通过JavaScript脚本来实现对目标应用的动态调用。当需要使用反射调用某个对象的方法或访问其字段时,可以通过Frida的`Java.use`方法获取到对应的类的代理对象,然后通过调用其方法来实现。例如,在Frida脚本中...
总的来说,这篇博客可能涵盖了从基础的JavaScript对象操作到高级的反射和元编程概念,为开发者提供了一个全面了解如何在JavaScript中获取和操作对象的指南。通过学习这些内容,开发者能够编写出更加高效、灵活和可...
Java 反射机制在对象打印中的应用 Java 反射机制是 Java 语言中的一种强大工具,允许程序在运行时检查和修改对象的行为。下面我们将讨论如何使用 Java 反射机制来打印一个对象的所有属性值。 Java 反射机制的概念 ...
通过本文的学习,我们深入了解了如何使用`prototype`来优化对象方法的存储,并学习了对象扩展和反射的基本原理及实际应用场景。这些技术不仅有助于提高代码的可维护性和性能,还能帮助我们在处理复杂数据结构时更加...
本文将深入探讨如何使用反射技术将对象转换为JSON格式的字符串。我们将以一个名为`JsonUtils`的Java类为例,该类可能包含实现此功能的方法。 首先,我们需要了解JSON(JavaScript Object Notation)是一种轻量级的...
JSON的特性使其成为理想的数据交换语言,广泛应用于各种JavaScript RIA(富客户端)框架及技术。 二、JSON的结构 JSON的结构非常简单,所有的JSON数据都基于以下三条规则: 1. 对象是一个无序的“名称/值”对集合...
然而,JavaScript中的一些高级特性,如ES6的Reflect对象和Proxy,提供了更接近反射的能力,如操作元数据和拦截操作。 以下是一个JavaScript反射的简单例子: ```javascript function MyClass() {} MyClass....
Javascript使用一些智能的语法和语义来仿真高度复杂的行为,其对象模型极为灵活、开放和强大,具有全部的反射性。 三、课程设计思路 为了提高教学效率和效果,本课程设计了基于网络的教学模式。通过使用昆明...
#### 知识点一:面向对象编程在JavaScript中的应用 - **定义**:面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它将程序设计围绕“对象”进行组织。在JavaScript中,虽然它本身是一种基于原型...
而在JavaScript中,反射可能用于动态创建和操作对象,或者在运行时检查和修改代码行为,如模块加载、依赖注入等。 总结: 反射为程序员提供了在运行时探索和操纵程序的能力,增强了代码的灵活性。尽管.NET和...
在JavaScript中,反射允许我们在运行时检查对象的属性、方法、构造函数等信息,甚至可以动态地调用方法或修改对象的状态。例如,通过`Object.getOwnPropertyDescriptor`和`Object.keys`等内置函数,我们可以获取对象...
Direct Web Remoting (DWR) 是一个开源Java库,它允许JavaScript在Web浏览器中与服务器端的Java对象进行交互,从而实现动态、实时的Web应用。在这个“dwr与反射相结合”的案例中,我们将深入探讨如何利用DWR的灵活性...
通过其灵活的对象模型和反射性,JavaScript能够创建高度交互式的网页应用。 三、课程核心内容与目标 课程内容涵盖了Web技术概述、HTML/XHTML基础、CSS技术、JavaScript编程基础、流程控制、函数、对象编程、浏览器...
总结来说,JavaScript的反射机制通过`for...in`循环提供了在运行时动态访问和修改对象属性的能力。这对于实现动态行为,特别是AJAX应用中的界面交互和样式管理,具有很大的价值。通过熟练掌握这一机制,开发者可以...
GWT是一个开源框架,它允许开发者使用Java语言编写客户端Web应用,然后编译成高效的JavaScript代码运行在浏览器上。 【描述】:尽管GWT在编译时会进行优化,使得在JavaScript端执行的代码尽可能高效,但其原生不...
### JavaScript高级应用与实践知识点概览 #### 一、JavaScript性能优化 1. **减少DOM操作**:直接操作DOM是比较耗时的操作之一。为了提高性能,可以尽量减少直接对DOM的操作次数,例如通过缓存DOM元素引用的方式...
7.2.3 反射机制--枚举对象属性 7.3 对象的构造 7.3.1 构造函数--一个双精度浮点数封装类的例子 7.3.2 缺省构造和拷贝构造 7.3.3 对象常量 7.4 对象的销毁和存储单元的回收 7.5 JavaScript...
Java手册则涵盖了Java语言的基础知识,包括语法、数据类型、流程控制、异常处理、类与对象、包、接口、多线程、输入/输出流、集合框架、反射、注解等。Java的面向对象特性非常突出,它支持类的封装、继承和多态。...