Challenge: Solution Review
This lesson will explain the solution to the problem from the last coding challenge.
We'll cover the following
Solution #
let configure = null;class ConfigureVals{constructor(initvalues){this.xpoint = initvalues.xpoint || 0;this.ypoint = initvalues.ypoint || 0;this.shape = initvalues.shape || null;}static getConfiguration(initvalues){if (!configure) {configure = new ConfigureVals(initvalues)}return configure;}}var configureObj1 = ConfigureVals.getConfiguration({ "xpoint": 8, "ypoint" : 9, "shape" : "rectangle" });console.log(configureObj1);var configureObj2 = ConfigureVals.getConfiguration({ "xpoint": 2, "ypoint": 4, "shape" : "circle" });console.log(configureObj2);
Explanation
In the solution, the first line defines the variable configure
which stores the reference to the first instance of ConfigureVals
. This variable is only initialized once.
The constructor
of the class accepts the object parameter initvalues
. It defines and initializes the values xpoint
, ypoint
, and shape
from lines 4-6.
this.xpoint = initvalues.xpoint || 0;
this.ypoint = initvalues.ypoint || 0;
this.shape = initvalues.shape || null;
As mentioned in the challenge, if no value of either xpoint
, ypoint
, or shape
is given, the values are set to 0
, 0
, null
.
The class contains the getConfiguration
method, which accepts the object parameter initvalues
. On line 9, the if
condition checks whether an instance for the class already exists.
if (!configure)
If it does not, a new instance is created (line 10).
configure = new ConfigureVals(initvalues)
If an instance already exists, it is returned (line 12); hence, no new instance is created.
return configure;
On line 16, a new instance is created.
var configureObj1 = ConfigureVals.getConfiguration({ "xpoint": 8, "ypoint" : 9, "shape" : "rectangle" });
Since this is the first instance it is created, and you see the following output:
ConfigureVals { xpoint: 8, ypoint: 9, shape: 'rectangle' }
In line 18, the getConfiguration
method is called again.
var configureObj2 = ConfigureVals.getConfiguration({ "xpoint": 2, "ypoint": 4, "shape" : "circle" });
However, since an instance already exists, the first instance is returned. Hence, you see the following output:
ConfigureVals { xpoint: 8, ypoint: 9, shape: 'rectangle' }
So both configureObj1
and configureObj2
are the same.
let configure = null;class ConfigureVals{constructor(initvalues){this.xpoint = initvalues.xpoint || 0;this.ypoint = initvalues.ypoint || 0;this.shape = initvalues.shape || null;}static getConfiguration(initvalues){if (!configure) {configure = new ConfigureVals(initvalues)}return configure;}}var configureObj1 = ConfigureVals.getConfiguration({ "xpoint": 8, "ypoint" : 9, "shape" : "rectangle" });var configureObj2 = ConfigureVals.getConfiguration({ "xpoint": 2, "ypoint": 4, "shape" : "circle" });console.log(configureObj2 == configureObj1);
Bonus question #
Implement the same solution but using the ES5 version instead.
Let’s discuss the builder pattern in the next lesson.