javascript中的反射机制

上传人:宝路 文档编号:2723153 上传时间:2017-07-26 格式:DOC 页数:3 大小:36KB
返回 下载 相关 举报
javascript中的反射机制_第1页
第1页 / 共3页
javascript中的反射机制_第2页
第2页 / 共3页
javascript中的反射机制_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

《javascript中的反射机制》由会员分享,可在线阅读,更多相关《javascript中的反射机制(3页珍藏版)》请在金锄头文库上搜索。

1、这里用“反射 ”这个词仅是一种概 念上的借用,且不论下 面提到的 javascript 的特性是否可以被称为“ 反射” , javascript 这种获得对象类型(通过typeof 运算)、构造函数(通过观察 constructor属性)甚至枚举属性和方法的特性确实为我们学习、研究和使用 javascript 带来了极大的便利。在javascript 中可以利用 for.in 方法枚举出对象中所有“ 可列举”的属性和方法,包括通过 prototype 机制“ 继承 ”的属性和方法例如:function classA()classA.prototype.a = function()return

2、a;function classB()classB.prototype.b = function()return b;classB.prototype = new classA();var msg = new Array();var b = new classB();for (idx in b)msg.push(idx);alert(msg);上面这个例子列举出了 classB 的对象b 的所有可列举属性和 方法(不可列举的属性方法包括大多数 javascript 内置对象的固有方法,如 Object.isPropertyOf 等等,但html对象和 dom 对象的方法都是可列举的),包括 a

3、、b 两个成员函数。另外由于javascript中通过关联 数组引用和通过函数调用引用无参方法等效(即 ba和 b.a()都返回字符串a),所以将上面例子的循环体改成 msg.push(bidx);就可以遍历执行 b 中的所有方法并将结果返回给msg。另外一个有趣的话题是关于 instanceof 运算的。javascript 的 instanceof 运算足够强大,强大到支持“ 继承” 的判 别,如上面那个例子, b instance of classA和 b instance of classB 的结果都 是 true。inst anceof 运算的这个能力正是 我们使用“多态”所需要的。

4、相反地,同强大的 instanceof 运算相比,javascr ipt 的 typeof运算则显得有些简陋。它只能识别出 string、number 等基本类型和objec t 与 function类型。这样,要判断对象类型的话,typeof 就无能为力。一个比较勉强的解决方案是依靠 constructor 属性来判断,但是,con structor 有个很烦人的问题是,它默认返回的是proto type 中的构造函数。结果上面的例子中对象 b 的 constructor 竟然返回 classA,而不是令人期待的 classB,于是,只好在每次继承之时手工修改 constructor 属性,

5、上面的例子中在 classB.prototype=new classA();之后添上 classB.constructor = classB。最后谈到dom 对象的问题。在javascript 中 dom 对象和普通对象可以通过判断tagName 属性来区别,但是这不是非常好的办法,因为你很难禁止他人在普通对象中定义 tagName 属性。另外一个比较好的方法是dom 对象的 constructor 属性一般为 undefined(同时, 显然地,instanceof Object 将返回 false,这是它们区别其他对象的一个明显特征,当然,前提是必须保证 javascript 的标准在将来

6、不会扩充到给dom 对象赋予确定的constructor 和严格的继承机制! 最后,我想要说的是,javascript的“反射机制” 是强大的,但是也是不完善的,所以在使用的时候需要小心,“常识”往往也容易令人犯错。结束话题之前发一个稍微封装的“反射” 管理类,希望它 能够给大家带来一些便利:function Reflector()Reflector.getType=function(obj)if (obj = null) /null 的类型return null; else if (obj instanceof Object) /普通对象return obj.constructor;else

7、 if (obj.tagName != null) /dom 对象return obj.tagName;elsereturn typeof(obj);Reflector.getAttributes=function(obj)var methods = new Array();for (idx in obj)methods.push(new Type(objidx,ClassManager.getType(objidx),idx);return methods; Reflector.getAttributeNames=function(obj)var methods = new Array();for (idx in obj)methods.push(idx);return methods;/描述类型的类,entity 是对象实体,type 是对象类型,name 是对象名称function Type(entity, type, name)this.Entity = entity;this.Type = type;this.Name = name;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号