是否有方法从内部获取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']
}发布于 2008-11-09 00:59:51
隐藏这些方法的技术原因有两个。
首先,当您在Test上执行一个方法时,“这个”将是在包含每个模块模式的公共方法的匿名函数的末尾返回的非类型化对象。
其次,方法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“关键字,它们将附加到全局上下文(通常是窗口对象),但这是我所知道的唯一类似于您所描述的行为。但是,如果这样做的话,该对象上还会有很多其他属性和方法。
发布于 2012-05-10 16:07:05
来自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);发布于 2008-11-08 23:35:54
Javascript实际上没有私有的概念。因此,javascript本身没有反射API。您所使用的技术与其说使它们成为私有的,不如说使它们不可访问;它们是隐藏的,而不是私有的。我认为您可以通过手动将这些方法放在某个位置来管理一些东西。
https://stackoverflow.com/questions/275351
复制相似问题