GoogleとStackOverflowでインスタンスのキャッシュとシングルトンを検索しようとしましたが、これに答える投稿を知っていれば、module.exportsに関する投稿のみが表示されます質問、それを参照して自由に感じる。ありがとうございました!ノード+ ES6クラス:キャッシュされたオブジェクトのセットを設定する
私はほとんど変更されないオブジェクトのセットを処理する必要があるため、パフォーマンスの最適化のためにキャッシュする必要があるアプリケーションがあります。
おもちゃの例ここでは単一のプロパティが直接設定されています。
私はアプリケーションを呼び出すと、私はassets_cached.jsにキャッシュされたオブジェクトのセットが含まれますオブジェクトをエクスポートします。私はES6クラスを持つアプリケーションの別のモジュールで
const Assets = {};
module.exports.Assets = Assets;
:
const _ = require('lodash')
const { Assets } = require('./assets_cached')
class Asset {
constructor(id, some_property) {
if (id in Assets) {
// Update instance data with cached properties
_.assign(this, Assets_cached[id]);
} else {
// If it's not cached, create a new object
this.id = id;
this.some_property = some_property;
// Cache this object
Assets_cached[id] = this;
}
}
getProperty() {
return this.some_property;
}
setProperty(value) {
this.some_property = value;
// Is there a way of avoiding having to do this double assignment?
Assets_cached[id].some_property = value;
}
}
module.exports = Asset;
some_propertyを2回(現在のインスタンスとキャッシュで、他のインスタンスが並行して更新されていることを確認しながら)設定する必要はありませんか?
理想的には私のような何かをしたいと思います:コンストラクタの内部
if (id in Assets) {
this = Assets.cached[id]
}
を、これは不可能です。
この作品を作成する最もエレガントで正しい方法は何ですか?
なぜ、同じアセットに対して複数の「Asset」インスタンスを持ちたいのですか? – Bergi
コンストラクタ内のキャッシングを処理したくない。コンストラクタは、インスタンスを作成するために必要最小限のコード用の場所です。しかし、すべての追加ロジックを 'Assets.create'のようなファクトリ関数に移すことについて考えるかもしれません。これはBergiの最初の素早い解答とうまく連動します。 –