Adding initialization checks

If you wish, you can make the .init() function more powerful by having the module crash if used without initialization:

// Source file: module_counter.2.js

/* @flow */

let name = "";
let count = 0;

let get = () => count;

let throwNotInit = () => {
throw new Error("Not initialized");
};
let inc = throwNotInit;
let toString = throwNotInit;

/*
Since we cannot initialize anything otherwise,
a common pattern is to provide a "init()" function
to do all necessary initializations. In this case,
"inc()" and "toString()" will just throw an error
if the module wasn't initialized.
*/
const init = (n: string) => {
name = n;
inc = () => ++count;
toString = () => `${name}: ${get()}`;
};

export default { inc, toString, init }; // everything else is private

In this fashion, we can ensure proper usage of our module. Note that the idea of assigning a new function to replace an old one is very typical of the Functional Programming style; functions are first class objects that can be passed around, returned, or stored.

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
3.133.144.197