76

簡単に言えば、私は PHP スタイルのゲッターが欲しい状況にいますが、JavaScript です。

私の JavaScript は Firefox でのみ実行されているため、Mozilla 固有の JS は問題ありません。

JS ゲッターを作成する唯一の方法は、その名前を指定する必要がありますが、考えられるすべての名前のゲッターを定義したいと思います。これが可能かどうかはわかりませんが、知りたいです。

4

9 に答える 9

100

Proxy出来る!これがあると嬉しいです!!答えはここにあります: Python の __getattr__ メソッドに相当する JavaScript はありますか? . 自分の言葉で言い換えると:

var x = new Proxy({}, {
  get(target, name) {
    return "Its hilarious you think I have " + name
  }
})

console.log(x.hair) // logs: "Its hilarious you think I have hair"

勝利のための代理!MDN ドキュメントを確認してください: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

chrome、firefox、および node.js で動作します。欠点: IE では動作しません - フリーキン IE。後で。

于 2016-03-20T07:35:17.323 に答える
47

最も近いものは__noSuchMethod__で、これは PHP の __call() に相当する JavaScript です。

残念ながら、__get/__set に相当するものはありません。残念なことに、それらを使用して __noSuchMethod__ を実装できた可能性がありますが、__noSuchMethod__ を使用して (C# のように) プロパティを実装する方法はまだわかりません。

var foo = {
    __noSuchMethod__ : function(id, args) {
        alert(id);
        alert(args);
    }
};

foo.bar(1, 2);
于 2009-06-15T03:26:36.220 に答える
5

機能する実装が本当に必要な場合は、 に対して 2 番目のパラメーターをテストすることで「ごまかす」ことがundefinedできます。これは、実際にパラメーターを設定するために get を使用できることも意味します。

var foo = {
    args: {},

    __noSuchMethod__ : function(id, args) {
        if(args === undefined) {
            return this.args[id] === undefined ? this[id] : this.args[id]
        }

        if(this[id] === undefined) {
            this.args[id] = args;
        } else {
            this[id] = args;
        }
    }
};
于 2012-10-17T14:52:40.667 に答える
1

PHP の関数のようなものを探しているのであれば__get()、Javascript はそのような構造を提供していないと思います。

私が考えることができる最善の方法は、オブジェクトの非関数メンバーをループしてから、それぞれに対応する「getXYZ()」関数を作成することです。

危険な疑似コードで:

for (o in this) {
    if (this.hasOwnProperty(o)) {
        this['get_' + o] = function() {
            // return this.o -- but you'll need to create a closure to
            // keep the correct reference to "o"
        };
    }
}
于 2009-06-15T01:04:09.370 に答える