A colleague pointed out that when I program in javascript I’m trying to force object oriented programming onto javascript. Rather than keeping with the javascript style of programming. The main problem is I rely on the “new” keyword in my javascript code.
The scenario:
I want a base object, DataInterface, that can handle api methods and data.
I have reusable methods that are interfaced, and then I want to be able to extend “DataInterface” and have the endpoint updated for each instance of the class.
The ideas:
It can be further debated whether this is the right solution for the scenario, but below is the outcome of the discussion:
DataInterface class with methods:
Eg:
1 2 3 4 | var DataInterface = function() { this.getAll : function() {}; //just an example this.getByField : function(field, value) {}; //just an example } |
And this base object has an api endpoint attribute
Eg:
1 2 3 | var DataInterface = function() { this.endpoint = ‘/endpoint’; } |
Then I want to extend off of this object and have specific data sets,
Eg
1 2 | Products.endpoint = ‘one’; Leads.endpoint = ‘two’; |
And then Products and Leads can have additional extended methods, but they inherit the same original behavior from the base class.
The focus:
I am going to focus on just updating the endpoint for two instances of DataInterface, and exclude any methods:
What I originally wrote:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | var DataInterface = function() { var endpoint; this.setEndpoint = function(_endpoint) { endpoint = _endpoint; }; this.getEndpoint = function() { return endpoint; }; return this; } var ProposalService = new DataInterface(); var ProductService = new DataInterface(); ProposalService.setEndpoint('one'); ProductService.setEndpoint('two'); console.log(ProposalService.getEndpoint()); console.log(ProductService.getEndpoint()); |
What this will output is ‘one’, and then ‘two’ in the console. Two instances of the DataInterface has been created with two unique endpoints.
Out with the new
However, if you remove the “new” keyword, which would make it more “javascript-like”:
Using the same class, but removing “new”.
1 2 3 4 5 6 | var ProposalService = DataInterface(); var ProductService = DataInterface(); ProposalService.setEndpoint('one'); ProductService.setEndpoint('two'); console.log(ProposalService.getEndpoint()); console.log(ProductService.getEndpoint()); |
What will happen now is the console will print out ‘two’, ‘two’. Instead of two instances, we have the same instance being pointed to by 2 variables. So the endpoint is not unique.
In comes the factory pattern
So if we rewrite the code a bit, and have DataInterface as a factory pattern that returns an object, then we can achieve the same result but without the new keyword.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | var DataInterface = function() { return { endpoint : '', setEndpoint : function(_endpoint) { this.endpoint = _endpoint; }, getEndpoint : function() { return this.endpoint; } }; }; var ProposalService = DataInterface(); var ProductService = DataInterface(); ProposalService.setEndpoint('one'); ProductService.setEndpoint('two'); console.log(ProposalService.getEndpoint()); console.log(ProductService.getEndpoint()); |
You will now get the output of ‘one’ and ‘two’ in the console, and we did not rely on the “new” keyword.
Just a handy little snippet of code to remember how to not use “new” in javascript when creating instances.