I'm creating a kind of factory class, where I store some pointers to class-level functions in a map, and the main factory function uses the map to determine how to create the service to be returned. Below is a simplified version:
class SpecificService {}
class DefaultService {}
class ServiceFactory {
constructor() {
this._serviceInstances = new Map();
this._serviceCreators = new Map([['someID', this._getSpecificService]]);
}
getService(identifier) {
const serviceGetter = this._serviceCreators.get(identifier) || this._getDefaultService;
return serviceGetter();
}
_getSpecificService() {
return this._getServiceInstance(SpecificService);
}
_getDefaultService() {
return this._getServiceInstance(DefaultService);
}
_getServiceInstance(serviceConstructor) {
let instance = this._serviceInstances.get(serviceConstructor);
if (!instance) {
instance = new serviceConstructor();
this._serviceInstances.set(serviceConstructor, instance);
}
return instance;
}
}
Usage of this is as follows:
const factory = new ServiceFactory();
const service = factory.getService('someID');
// expect(service).toBeInstanceOf(SpecificService);
However I'm running into an error where the getServiceInstance
appears to be undefined
Cannot read property 'getServiceInstance' of undefined
I'm expecting the chain of calls to be:
getService
->_getSpecificService
->_getServiceInstance
However what I'm seeing is:
getService
->_getSpecificService
->undefined
What's going on here? I'm storing a reference to this._getSpecificService
(which has a reference to this._getServiceInstance
) in a map, however when the former is called, the latter does not appear to exist?