代码之家  ›  专栏  ›  技术社区  ›  Owen Ryan Doherty

Javascript反射

  •  28
  • Owen Ryan Doherty  · 技术社区  · 16 年前

    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()

    编辑

    function myFunction() {
      var test1 = 1;
      var test2 = 2;
      var test3 = 3;
    } 
    

    myFunction() 从内部 myFunction()

    function myFunction() {
      var test1 = 1;
      var test2 = 2;
      var test3 = 3;
    
      alert(current.properties); // would be nice to get ['test1', 'test2', 'test3']
    }
    
    7 回复  |  直到 16 年前
        1
  •  29
  •   Simon Featherstone    8 年前

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

    Module Pattern .

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

    结果如下所示:

    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();
    

    编辑:

        2
  •  5
  •   Jay    12 年前

    从…起 http://netjs.codeplex.com/SourceControl/changeset/view/91169#1773642

    //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);
    
        3
  •  2
  •   sblundy    16 年前

    Javascript实际上没有任何私有的概念。因此,javascript本身没有反射API。你所使用的技术与其说使它们成为私有的,不如说使它们无法访问;它们是隐藏的,不是私人的。我想你可以通过手动把这些方法放到某个地方来管理一些事情。

        4
  •  1
  •   eswald    16 年前

    测试代码的部分问题在于,测试是由return语句创建的对象: { getMethods : getMethods } 它没有testOne、testTwo或testThree方法;相反,这些方法仅在与原始getMethods函数相同的命名空间中可用。

        5
  •  1
  •   Rune FS    12 年前

    只要对函数的定义方式稍作更改,就可以实现所需的功能。将函数的实际实现包装在对象文字中,它将如下所示:

    (function() {
        var obj = {
        // private methods
        testOne: function () {},
        testTwo : function () {},
        testThree: function () {},
        // public methods
        getMethods : function () {
          for (i in this) {
            alert(i); // shows getMethods, but not private methods
          }
        }
        };
        return { getMethods : function(){return obj.getMethods();} }
    })();
    
        6
  •  1
  •   GitaarLAB    9 年前

    你可以用 var that = this; 诀窍:

    var Test = function() {
        var that = this;
        function testOne() {}
        function testTwo() {}
        function testThree() {}
        function getMethods() {
          for (i in that) {
            alert(i);
          }
        }
        return { getMethods : getMethods }
    }();
    
        7
  •  0
  •   Oli    16 年前

    this 按预期工作?

    var t = new Test();
    t.getMethods();
    

    JS Serializer . 我不久前使用它进行一些调试,我认为它适用于私有变量。