8

私は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 />");
    }
}

結果:

x(数値)= 32

_hello(string)= Hello World

_item(number)= 123.345

hello(function)= function(){alert( "hello"); }

goodbye(function)= function(){alert( "goodbye"); }

私の挑戦の次の部分は、オブジェクト名とオブジェクトへのパスを(可能であれば)反映できるものを構築することです。

この例を使用して:..。

var x = new Foo.Bar.Test();

xから「テスト」を反映するにはどうすればよいですか?例えば:

ReflectName(x); //returns "Test";

また、xへのパスをどのように反映できますか?例えば:

ReflectPath(x) //returns Foo.Bar.Test

JavaScriptを使用してこれら2つのことを行うことは可能ですか?私はこれを調査しましたが、これまでのところ実行可能な解決策を思い付くことができませんでした。

オブジェクト/関数の名前とパスをハードコーディングする必要があるソリューションは必要ありません。これは、リフレクションを使用するポイントを無効にするためです。

4

3 に答える 3

13

JavaScriptにはクラスがありません(ただし、私にはわからない理由でJavaを模倣しているコードスタイルのため、いくつかあると思われるかもしれません)。 名前空間に登録されてFoo.Bar.Testいるクラスを意味するのではなく、オブジェクトの属性として割り当てられているオブジェクトの属性として割り当てられている関数を意味します。TestFoo.BarTestBarFoo

「番号が割り当てられているすべての変数を教えてください」のようにリフレクションを行うことはできません。その結果、属性の1つに7含まれるすべてのオブジェクトをリストすることはできません。Test

これは実際には良いことであり、新しい可能性を開きますが、最初は混乱するかもしれません。

ところで、JavaScriptにはクラスがないので、用語の反映はあまり幸運ではないと思います。そしてnew Foo()、「Fooの新しいインスタンスを作成する」という意味ではなく、「新しいオブジェクトを作成し、Fooそのオブジェクトのコンテキストで関数を実行して、最終的にそれを返す」という意味です。そうですnew、JavaScriptでさらに高度なことをしたい場合、キーワードは非常に混乱します。 、Java / C#の経験を決して信用しないでください。JavaScriptはJavaを偽造します(初心者を怖がらせず、簡単なことをすばやく実行できるようにするためだと思います)が、それは大きく異なります。

于 2012-12-17T10:23:28.310 に答える
5

これはJavaScriptでは不可能です。(JavaScriptの型システムをより深く理解するには、これを読むことをお勧めます。)

実行できる最善の近似は、静的JSON構造をクエリすることです。

于 2012-12-17T10:39:33.583 に答える
2

最初の質問に答える

function ReflectName(obj) { return obj.__proto__.constructor.name }

2番目の質問はもう少し難しく、定義を使用してより多くの設定が必要になります。

ここでもう少しよく答えられます:Javascriptオブジェクト:親を取得します

于 2017-11-23T03:22:34.787 に答える