ser*_*0ne 6 javascript reflection
我一直在研究JavaScript中反射的可能性.我已经有一个简单的反射器,它可以列出一个对象/函数的成员,如下所示:
window["Foo"] = {
"Bar": {
"Test": function () {
this.x = 32;
this._hello = "Hello World";
this._item = 123.345;
this.hello = function() {
alert("hello");
};
this.goodbye = function() {
alert("goodbye");
}
}
}
}
$(document).ready(function () {
var x = new Foo.Bar.Test();
Reflect(new Foo.Bar.Test());
});
function Reflect(obj) {
for (var item in obj) {
$("body").append(item + "(" + typeof obj[item] + ") = " + obj[item] + "<br />");
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
x(数字)= 32
_hello(string)= Hello World
_item(数字)= 123.345
hello(function)= function(){alert("hello"); }
再见(function)= function(){alert("goodbye"); }
我的挑战的下一部分是构建可以反映(如果可能)对象名称和对象路径的东西.
使用这个例子:...
var x = new Foo.Bar.Test();
Run Code Online (Sandbox Code Playgroud)
我怎样才能反映出来自x的"测试"?例如:
ReflectName(x); //returns "Test";
Run Code Online (Sandbox Code Playgroud)
另外,我如何反映x的路径?例如:
ReflectPath(x) //returns Foo.Bar.Test
Run Code Online (Sandbox Code Playgroud)
可以使用JavaScript做这两件事吗?我研究了这个,到目前为止还没有设法提出任何可行的解决方案.
我不想要一个需要对对象/函数的名称和路径进行硬编码的解决方案,因为这会破坏使用反射的点.
ska*_*lee 12
JavaScript中没有类(尽管由于代码风格,我不知道模仿Java的原因,你可以认为有一些). Foo.Bar.Test并不是指Test在命名空间中注册的类Foo.Bar,而是指定为Test某个对象的属性的函数,该对象被指定为Bar某个对象的属性Foo.
你不能做像"给我所有变量7分配给哪个变量"这样的反射,因此你不能列出其中Test一个属性所包含的所有对象.
这实际上是好的并且开辟了新的可能性,但在开始时可能会令人困惑.
BTW由于JavaScript中没有类,我认为术语反映不是很幸运.而new Foo()并不意味着"创建富的新实例",而是"创建一个新的对象,并执行功能Foo在该对象的情况下,最后返回了.是的,new关键字是非常混乱,如果你想做的任何事情在JavaScript中更高级,永远不要相信你的Java/C#体验.JavaScript伪造Java(我想不要吓唬新人并允许他们快速做简单的事情),但这是非常不同的.