JSFiddle - React, Tailwind, and code Playground

by kassiomaia

JavaScript

function versionControlFactory() {
	return Object.assign({}, {
  	_history: [],
  	saveProperty(prop, value) {
    	this._history.push({
      	at: new Date(),
      	prop,
        value,
      })
    },
    undo() {
    	var previous = this._history.pop()
      if (previous) {
        this['_' + previous.prop] = previous.value
      }
    }
  })
}

function objectFactory(props) {
  return Object.assign({}, props, versionControlFactory(), {
  	_name: '',
    setName(value) {
      this.saveProperty('name', this._name)
    	this._name = value;
    },
    getName() {
    	return this._name;
    }
  })
}

function particuleFactory() {
	return objectFactory({
  	_position: [0, 0, 0],
    setPosition(x, y, z) {
    	this.saveProperty('position', this._position);
      this._position = [x, y, z];
    },
    getPosition() {
    	return this._position;
    }
  })
}


var genericObject = particuleFactory()

genericObject.setName("Generic Object")
genericObject.setName("Kássio Maia")
genericObject.setPosition(10, 20, 30)

genericObject.undo()

console.log(genericObject)