すべてのプロパティのためのJavaScriptゲッター
-
13-09-2019 - |
質問
かいつまん:。私はPHPスタイルのゲッターが欲しい状況でだけど、JavaScriptで
Mozillaの特定のJSは私でOKですので、私のJavaScriptは、Firefoxのみで実行されてます。
私はJSゲッターを作るために見つけることができる唯一の方法は、その名前を指定する必要がありますが、私は、のすべてのの可能な名前のgetterを定義したいと思います。私はこれが可能であるかどうかわからないんだけど、私は非常に多くの知っているように思います。
解決
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 /ドキュメント/ウェブ/ JavaScriptを/リファレンス/ Global_Objects /プロキシする
は、クロム、Firefox、およびnode.js.で動作します欠点は: - freakinのIE IEでは動作しません。すぐます。
他のヒント
あなたが見つけることができる最も近いある、 __noSuchMethod__ のですPHPの__callのJavaScriptの者と同等()。
残念ながら、彼らと我々は__noSuchMethod__を実装している可能性があるため、恥をある__get / __セット、の相当するものはありませんが、私はまだ__ __noSuchMethod使用(C#の場合のように)プロパティを実装する方法が表示されません。
var foo = {
__noSuchMethod__ : function(id, args) {
alert(id);
alert(args);
}
};
foo.bar(1, 2);
あなたは、PHPのようなの見栄えの良いコードを持っているプロキシクラスを組み合わせることができます。の
class Magic {
constructor () {
return new Proxy(this, this);
}
get (target, prop) {
return this[prop] || 'MAGIC';
}
}
これは、ハンドラに結合するので、あなたではなく、ターゲットのこれを使用することができます。
注:PHPとは異なり、プロキシは、すべてのプロパティの要求を処理しますの
。let magic = new Magic();
magic.foo = 'NOT MAGIC';
console.log(magic.foo); // NOT MAGIC
console.log(magic.bar); // MAGIC
あなたはhref="http://caniuse.com/#feat=proxy" rel="noreferrer"> http://caniuse.com/#feat=proxy のプロキシ http://caniuse.com/#feat=es6-class に。両方のノード8をサポートます。
Javascriptの1.5 には、<のhref = "HTTPSを持っています.ORG / EN / Core_JavaScript_1.5_Reference /オペレータ/ Special_Operators / get_Operator "REL = "noreferrer">ゲッター/セッターには、糖衣構文に。それはここのジョンResig氏によって非常にうまく説明しています。
これは、Webでの使用のための十分な汎用的ではないですが、(あなたは、サーバー側でそれを使用したい場合は、またRhinoのを)確かにFirefoxがそれらを持っています。
、あなたはこれはまた、あなたが実際に設定されたパラメータにgetを使用できることを意味、undefined
に対する二番目のパラメータをテストしてarroundのあなたの方法を「ごまかす」ことができます。
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;
}
}
};
あなたがPHPの<のhref = "http://us3.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.members" のrelような何かを探しているなら=」 "nofollowをnoreferrer> __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"
};
}
}
私は自分のソリューションを構築するためにnickfs'の答えを使用して終了しました。私の解決策は、自動的にすべてのプロパティのget_メソッド{PROPNAME}とSET_ {PROPNAME}関数を作成します。関数は、すでにそれらを追加する前に存在しているかどうかはチェックしません。これは、あなたがそれを上書き得ることのリスクなしに、当社独自の実装でデフォルトの取得または設定メソッドをオーバーライドすることができます。
for (o in this) {
if (this.hasOwnProperty(o)) {
var creategetter = (typeof this['get_' + o] !== 'function');
var createsetter = (typeof this['set_' + o] !== 'function');
(function () {
var propname = o;
if (creategetter) {
self['get_' + propname] = function () {
return self[propname];
};
}
if (createsetter) {
self['set_' + propname] = function (val) {
self[propname] = val;
};
}
})();
}
}