ES6 encapsulation: favorite tools

Run Settings
LanguageJavaScript
Language Version
Run Command
/** * @author: K. Lae Kettavong * @date: 2/11/2019 * @description: Using IIFE to encapsulate class for displaying my favorite tools for the given year(s) */ class Validator { static enforceNumber(num){ if(!num || typeof(num) !== 'number') this.throwTypeError('number') } static enforceString(str){ if(!str || typeof(str) !== 'string') this.throwTypeError('string') } static enforceArray(array){ if(!array || !Array.isArray(array)) this.throwTypeError('array') } static throwTypeError(type){ throw new TypeError(`Invalid input, must be a ${type}.`) } } const Tools = (() => { //private members let _privateYears; let _privateTools; return class { constructor(tools, years) { Validator.enforceArray(tools) Validator.enforceArray(years) _privateTools = tools _privateYears = years } addYear(year) { Validator.enforceNumber(year) _privateYears.push(year) } removeYear(year) { Validator.enforceNumber(year) _privateYears = _privateYears.filter(yr => yr !== year ) } addTool(tool) { Validator.enforceString(tool) _privateTools.push(tool) } removeTool(tool) { Validator.enforceString(tool) _privateTools = _privateTools.filter(tl => tl !== tool) } echo(){ console.log(`My favorite tools in ${_privateYears.join(', ')}`) _privateTools.forEach((tool, indx) => { console.log(` ${indx+1}. ${tool}`) }) } } })() const yearsArr = [2018, 2019] const toolsArr = ['ES6+', 'Node.js', 'TypeScript', 'React', 'Redux', 'MongoDB', 'GraphQL', 'HTML5', 'CSS3', 'SASS', 'Webpack', 'Babel', 'glot.io', 'repl.it'] const favoriteTools = new Tools(toolsArr, yearsArr) favoriteTools.addYear(2020) favoriteTools.addTool('Yarn') favoriteTools.removeTool('MongoDB') favoriteTools.removeYear(2020) favoriteTools.echo()
Editor Settings
Theme
Key bindings
Full width
Lines