访问javascript私有变量
来源:Ruby's Louvre 发布时间:2010-01-19 13:56:00
javascript作为一个动态语言,动态解析脚本的方法非常多,如万恶又万能的eval,低调的Function,IE独占的execScript,搭上DOM那边的script标签的text属性,W3C的script标签还能通过直接加文本节点或innerHTML解析脚本。有了这些方法,私有属性根本无处可藏。以前FF的eval更加 * ,如果是通过模块模式构造的函数,获取其私有变量轻而易举。不过其bug已升级掉,就不说了。
说说其原理,就是内层作用域的函数可以随意访问外层作用域的变量。为此我们需要设计一个内部函数“打进”原函数的内部,不过直接修改原函数不太好,我们可以拷贝一个副本,但显然我们也用不着全单接收,只要一部分就可以。怎样只要一部分呢?所有函数都有一个叫toString的属性,我们拿它进行改造加入我们的内部函数,然后再通过动态解析复活它。
var reveal = function(fn,t){ //用于获取目标函数的私有变量 //作为新函数的内部函数而存在 var get = function(t){ return eval(t); }; //获取原函数的函数体 var body = fn.toString().match(/function.+?\{([\s\S]*)\}/)[1]; //新函数,有一个参数,返回目标函数的私有变量 var newFn = Function('a','var get =' + get + '\n' +body+"\n;return get(a)"); return newFn(t);//执行新函数 }
用法:
var parent = function(){ var p = '私有变量'; }; var pp = dom.reveal(parent,'p'); alert(pp)//私有变量!
扩展一下,弄成一个类工厂。
dom = {}; dom.keys = function(obj){ var results = []; for(var key in obj){ if(obj.hasOwnProperty(key)) results[results.length] = key; } return results; }; dom.forEach = function (arr, fn, bind) { if (typeof arr.forEach === "function") { arr.forEach(fn, bind); } else { for (var i = 0,n = arr.length; i < n; i++) fn.call(bind, arr[i], i, arr); //bind,value,key,arr } }; dom.reveal = function(fn){ var get = function(target){ return eval(target); }; //获取原函数的函数体 var body = fn.toString().match(/function.+?\{([\s\S]*)\}/)[1]; var klass = Function('this.get =' + get + '\n' + body); klass.prototype = fn.prototype;//获取原函数的原型 var keys = dom.keys(fn);//获取原函数的所有静态属性 dom.forEach(keys,function(key){ klass[key]= fn[key] }); return klass; } //**************************** var parent = function(){ var _p = '这是私有变量'; }; parent._s = "静态属性" parent.prototype.__p = "原型属性" var son = dom.reveal(parent); var s = new son; var pp = s.get('_p'); alert(son._s) alert(pp) alert(s.__p)
猜你喜欢
- 如果您是HTML的初学者,请您先自学HTML。因为DHTML是现有的HTML技术的一个综合,所以HTML语言对学习动态HTML是
- 本文帮你六步改善SQL Server安全规划全攻略。一、什么是SQL注入式攻击所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的
- 越来越多的网站在logo中添加叶子元素,而此类logo又常常使用绿色,这可以给人希望、清新、健康的感觉,从而很容易被接受和认可。今天我们又收
- 昨天在做mergeCSS的时候遇到两个正则匹配的问题,也花了不少的时间,最后在CSS森林群的 CE 同学帮助下,才完成了这俩正则,特别记录下
- 最近开始在项目中使用Quickwork For Asp,虽然该框架是自己独立完成的,不过功能没做过详细的总结,所以很多参数总是会弄错,毕竟鱼
- 在FF下,如果内容含有FLASH,FLASH不会被隐藏掉,做为变通,我在收缩完成之后,将生成的内容容器隐藏掉了。<!DOCTYPE h
- JavaScript 读取、删除 Cookie 的函数* * WebFXCookie class */ fun
- 下面就是我们的authenticate.asp页面,在这里,将用户的信息收集起来,连同最初的URL一起传到一个识别用户身份的页面中。我们可用
- 用javascript实现Base64编码—解决中文问题因javascript求出来的是Unicode要转换成Ansi后才能对它进行Base
- 认知心理学家Donald A. Norman将人类的行动分解成七个阶段:1. 确定目标2. 确定意图3. 明确行动内容4. 执行5. 感知外
- 问题:导入数据时是否需要禁用索引?解答:在使用load data导入数据时,如果导入的表是MyISAM的,对于空表,MySQL数据库会把所有
- 但是如果是让你接手一个二等残废的网站,并让你在上面改版,而且不能推翻式改版,只能逐步替换旧的程序,那么你会非常痛苦,例如我遇到的问题: 问题
- ps:不曾想还有那么好用的方法。汗一个先。Div即父容器不根据内容自适应高度,我们看下面的代码:<div id="main&
- Web Standards Solutions The Markup and Style Handbook - Chapter 1 清单首发
- photoshop快捷键大全: 工具箱(多种工具共用一个快捷键的可同时按【Shift】加此快捷键选取)相关文章:网页设计软件FrontPag
- 当存储一个CHAR值时, Mysql会除去尾随空间, 这个行为有点让人困惑, 用一个具体的例子来看一下: 首先 ,创建一个只有一个CHAR(
- 内部存储格式:世纪、年、月、日、小时、分钟、秒默认格式是:DD-MON-RR。SYSDATE 返回当前的系统时间。SELECT S
- 一.WITH AS的含义 WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片
- Tips 1:新增数据表与定义字段更加直观若要建立新数据表,可以在开启数据库后,直接单击“创建”标签,在“表”选项组中单击“表”按钮,即可新
- 生成静态页的方法有很多种,我比较喜欢用xmlhttp的方法生成,因为我不用考虑很多东西,我只要把动态的asp页面编写好就行了。<% s