JavaScript中的反思

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(我想不要吓唬新人并允许他们快速做简单的事情),但这是非常不同的.


thS*_*oft 5

这在JavaScript中是不可能的.(为了更深入地了解JavaScript的类型系统,我建议您阅读此内容.)

您可以做的最好的近似是查询静态 JSON结构.