访问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)


标签:变量,JavaScript,函数
0
投稿

猜你喜欢

  • 微软:跑分速度不是IE8的开发重点

    2008-09-12 12:10:00
  • thinkphp5实用入门进阶知识点和各种常用功能代码汇总

    2023-05-25 02:48:34
  • 向MySQL数据库的表中录入数据的实用方法

    2008-12-17 16:24:00
  • asp如何让页面过时并指定一个过时时间?

    2010-05-13 16:40:00
  • 防注入asp过滤sql特殊字符函数

    2007-10-23 17:50:00
  • 保存透明gif时出现锯齿解决法

    2008-06-26 18:10:00
  • URL编码与SQL注入

    2007-09-26 12:41:00
  • W3C网页内容无障碍指南2.0(WCAG)

    2008-11-20 13:40:00
  • Access数据库出现0x80004005问题的解决方法

    2008-11-28 14:25:00
  • WAP2.0网页设计中的交互细节

    2010-08-12 20:50:00
  • 不错的广告定位效果代码

    2009-06-05 18:51:00
  • Flash在某些多标签浏览器中的“伪沙箱”问题

    2011-01-06 12:37:00
  • SQL语句 一个简单的字符串分割函数

    2011-10-24 20:06:33
  • 从浏览器想开去

    2008-07-29 12:52:00
  • 完全卸载MYSQL

    2011-02-23 12:11:00
  • 何时将数据装载到Application 或 Session 对象中去?

    2009-12-03 20:17:00
  • IE7新支持的CSS属性和属性选择符

    2008-03-16 14:26:00
  • AJAX无刷新验证用户名是否存在

    2007-08-10 10:07:00
  • IE window对象介绍

    2008-05-21 18:47:00
  • css学习笔记:表格隔行点击变色

    2009-04-30 13:15:00
  • asp之家 网络编程 m.aspxhome.com