Quick actions

cmd+k|ctrl+k

Navigation

Languages

ES6 encapsulation: favorite tools

Snippet info

Language

JavaScript

Visibility

public

Author

laekettavong

Created

2019-02-11T18:54:26Z

Updated

2019-02-18T20:33:08Z


/**
 * @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()
INFO