首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript反射

Javascript反射
EN

Stack Overflow用户
提问于 2008-11-08 23:05:17
回答 7查看 32.8K关注 0票数 29

是否有方法从内部获取javascript对象的所有方法(私有、特权或公共)?下面是示例对象:

代码语言:javascript
复制
var Test = function() {
// private methods
    function testOne() {}
    function testTwo() {}
    function testThree() {}
// public methods
    function getMethods() {
      for (i in this) {
        alert(i); // shows getMethods, but not private methods
      }
    }
    return { getMethods : getMethods }
}();

// should return ['testOne', 'testTwo', 'testThree', 'getMethods']
Test.getMethods();

当前的问题是getMethods()中的代码,简化的示例只返回公共方法,但不返回私有方法。

编辑:我的测试代码可能(也可能不是)使我希望得到的内容过于复杂。鉴于以下情况:

代码语言:javascript
复制
function myFunction() {
  var test1 = 1;
  var test2 = 2;
  var test3 = 3;
} 

有没有办法从myFunction()内部找出myFunction()中存在哪些变量。伪代码如下所示:

代码语言:javascript
复制
function myFunction() {
  var test1 = 1;
  var test2 = 2;
  var test3 = 3;

  alert(current.properties); // would be nice to get ['test1', 'test2', 'test3']
}
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2008-11-09 00:59:51

隐藏这些方法的技术原因有两个。

首先,当您在Test上执行一个方法时,“这个”将是在包含每个模块模式的公共方法的匿名函数的末尾返回的非类型化对象。

其次,方法testOne、testTwo和testThree不附加到特定对象,只存在于匿名函数的上下文中。您可以将这些方法附加到内部对象,然后通过一个公共方法公开它们,但是它不会像原始模式那么干净,如果从第三方获得这些代码也不会有帮助。

结果会是这样的:

代码语言:javascript
复制
var Test = function() {
    var private = {
        testOne : function () {},
        testTwo : function () {},
        testThree : function () {}
    };

    function getMethods() {
        for (i in this) {
            alert(i); // shows getMethods, but not private methods
        }
        for (i in private) {
            alert(i); // private methods
        }
    }
    return { getMethods : getMethods }
}();

// will return ['getMethods', 'testOne', 'testTwo', 'testThree']
Test.getMethods();

编辑:

很遗憾,我不会。局部变量集无法通过一个自动关键字访问。

如果删除"var“关键字,它们将附加到全局上下文(通常是窗口对象),但这是我所知道的唯一类似于您所描述的行为。但是,如果这样做的话,该对象上还会有很多其他属性和方法。

票数 29
EN

Stack Overflow用户

发布于 2012-05-10 16:07:05

来自http://netjs.codeplex.com/SourceControl/changeset/view/91169#1773642

代码语言:javascript
复制
//Reflection

~function (extern) {

var Reflection = this.Reflection = (function () { return Reflection; });

Reflection.prototype = Reflection;

Reflection.constructor = Reflection;

Reflection.getArguments = function (func) {
    var symbols = func.toString(),
        start, end, register;
    start = symbols.indexOf('function');
    if (start !== 0 && start !== 1) return undefined;
    start = symbols.indexOf('(', start);
    end = symbols.indexOf(')', start);
    var args = [];
    symbols.substr(start + 1, end - start - 1).split(',').forEach(function (argument) {
        args.push(argument);
    });
    return args;
};

extern.Reflection = extern.reflection = Reflection;

Function.prototype.getArguments = function () { return Reflection.getArguments(this); }

Function.prototype.getExpectedReturnType = function () { /*ToDo*/ }

} (this);
票数 5
EN

Stack Overflow用户

发布于 2008-11-08 23:35:54

Javascript实际上没有私有的概念。因此,javascript本身没有反射API。您所使用的技术与其说使它们成为私有的,不如说使它们不可访问;它们是隐藏的,而不是私有的。我认为您可以通过手动将这些方法放在某个位置来管理一些东西。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/275351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档