当前位置:  开发笔记 > 编程语言 > 正文

Javascript反思

如何解决《Javascript反思》经验,为你挑选了2个好方法。

有没有办法从内部获取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(),简化示例将仅返回公共方法,但不返回私有方法.

编辑:我的测试代码可能(或可能不)过于复杂,我希望得到的.给出以下内容:

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']
}

小智.. 28

隐藏这些方法的技术原因是双重的.

首先,当您在Test对象上执行方法时,"this"将是匿名函数末尾返回的无类型对象,该函数包含模块模式的公共方法.

其次,方法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();

编辑:

很不幸的是,不行.无法通过单个自动关键字访问本地变量集.

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



1> 小智..:

隐藏这些方法的技术原因是双重的.

首先,当您在Test对象上执行方法时,"this"将是匿名函数末尾返回的无类型对象,该函数包含模块模式的公共方法.

其次,方法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();

编辑:

很不幸的是,不行.无法通过单个自动关键字访问本地变量集.

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



2> Jay..:

来自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);

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有