我一直在研究 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 />");
}
}
Results:
x(数字)= 32
_hello(字符串) = 你好世界
_item(数字) = 123.345
你好(函数)=函数(){警报(“你好”); }
再见(函数)=函数(){警报(“再见”); }
我的挑战的下一部分是构建一些可以反映(如果可能的话)对象名称以及对象路径的东西。
使用这个例子:...
var x = new Foo.Bar.Test();
我如何从 x 反射回“Test”?例如:
ReflectName(x); //returns "Test";
另外我怎样才能反射回 x 的路径?例如:
ReflectPath(x) //returns Foo.Bar.Test
使用 JavaScript 可以完成这两件事吗?我对此进行了研究,但到目前为止还没有提出任何可行的解决方案。
我不想要一个需要对对象/函数的名称和路径进行硬编码的解决方案,因为这会破坏使用反射的意义。
JavaScript 中没有类(尽管由于我不知道的原因模仿 Java 的代码风格,你可能会认为有一些类)。Foo.Bar.Test
并不意味着阶级Test
已在名称空间中注册Foo.Bar
,但是被指定为属性的函数Test
被指定为属性的某个对象Bar
某些物体称为Foo
.
你不能像“给我所有变量到哪个数字”那样进行反思7
已分配”,因此您无法列出所有包含的对象Test
在他们的属性之一。
这实际上很好,并开辟了新的可能性,但一开始可能会令人困惑。
顺便说一句,由于 JavaScript 中没有类,我相信术语反射并不是很幸运。和new Foo()
并不意味着“创建 Foo 的新实例”,而是“创建一个新对象并执行函数Foo
在该对象的上下文中,最后返回它。是的,那个new
关键字非常令人困惑,如果你想在 JavaScript 中做任何更高级的事情,永远不要相信你的 Java/C# 经验。 JavaScript 模仿了 Java(我想不要吓到新手,让他们快速做简单的事情),但它有很大不同。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)