私は現在JavaScriptを学習しています。私はここ数日、いくつかの本を読んできましたが、私は以下のことについて助けたいと思います。インスタンス内のマルチオブジェクトオブジェクトキャッシュを隠すクリーナーの方法
たとえば、Label
という名前のクラスがあるとします。そのコンストラクタは、一部の翻訳を含むdata
オブジェクトを受け入れます。私は、これらの翻訳をLabelインスタンスの中で「隠す」ようにして、text
プロパティを残りのプログラムに公開します。
一つの解決策は、_active
で参照翻訳、および翻訳を切り替えるsetLang()
方法を返すゲッターメソッドactive()
、_translations
からの翻訳を参照_active
特性を有することになります。しかしそれは、ラベルインスタンスのactive
を常にlabel.active.text
のようなテキストにするよう強制します。
(私はそれはプライベートではありませんので、_translations
オブジェクトが実際に隠されていないことを承知している。Label
クラスはあまり意味がないかもしれないが、それは私が思いついた簡単な例ですが、_translations
オブジェクトは翻訳の私たちのためにキャッシュすることもAPI呼び出しを介して取得します)
確実に、ラベルのactive
メソッド呼び出しを避けるために、このようなものを実装するクリーナーの方法が必要です。何か案は?
私はget text(){ return this._active.text }
を持つことができましたが、翻訳オブジェクトに多くのプロパティがあった場合はどうなりますか?
ありがとうございます!プロキシを使用するには、@ Bergiの提案後
const data = {
// these objects could possibly have more properties
en: {text: 'Text in english.'},
zh: {text: "Let's imagine this one is in chinese."}
};
class Label {
constructor(data) {
this._translations = {};
for (let lang in data)
this._translations[lang] = data[lang];
this._active = this._translations.en;
}
get active() {
return this._active;
}
// switch between translations
// may be used to get translations from an API endpoint
// if the translation exists, read from _translations cache
// if not, fetch from server (not implemented)
setLang(value) {
return (this._translations[value] &&
(this._active = this._translations[value])) !== undefined;
}
}
let label = new Label(data);
console.log(label.active.text);
label.setLang('zh');
console.log(label.active.text);
// I'd like to simply call label.text to return the text
はなぜ単一 'Label'は、複数のテキストを持っているでしょうか?その '.text'ゲッタは行く方法です。 – Bergi
こんにちは@Bergi、コメントありがとうございました。 'Label'クラスは単なる例です。 'data'の中の各オブジェクトに' text'プロパティ以上のものがあるとしましょう。あるいは、より良いことに、ダイナミックに作成されたいくつかのプロパティ。あなたはそれをどのように扱いますか? –
おそらく、 'getTranslation(" text ")'メソッドを使用します。また、そのメソッドへのすべてのプロパティアクセスを構文的な砂糖として委譲するための 'Proxy'を作ることもできます。 – Bergi