I've tried to search for instance caching and singletons on Google and StackOverflow without success, seeing only posts about module.exports, if you know a post that answers this question, feel free to reference it. Thank you!
I have an application that needs to work on a set of objects that rarely change, and hence need to be cached for performance optimisation.
Here is a toy example where a single property is set directly.
When I call the application, I export an object that will contain the set of cached objects in assets_cached.js:
const Assets = {};
module.exports.Assets = Assets;
In another module of the application I have an ES6 class:
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;
How may I avoid having to set the some_property twice (in the current instance and the cache, while ensuring that other instances are updated in parallel)?
Ideally I'd like to do something like:
if (id in Assets) {
    this = Assets.cached[id]
}
inside the constructor, but this is not possible.
What's the most elegant and correct way of making this work?
 
     
    