Skip welcome & menu and move to editor
Welcome to JS Bin
Load cached copy from
 
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
</body>
</html>
 
// -- ORM lib code --
function ORM() {
  // We will maintain a special property on each instance to keep track of
  // its dirty properties.  The property holds an object where the keys are
  // the dirty property keys.
  const dirtyPropsSymbol = Symbol('Prop holding obj where keys are dirty props');
  const resetDirtyProps  = (instance) =>       instance[dirtyPropsSymbol] = {};
  const markDirtyProp    = (instance, prop) => instance[dirtyPropsSymbol][prop] = true;
  const getDirtyProps    = (instance) =>       Object.keys(instance[dirtyPropsSymbol]);
  
  return {
    // Get an instance of `Fn` with the id of `id`
    getById: (Fn, id) => {
      // In real version we would perhaps hit an API or DB, but here we'll
      // just `new` an instance
      const instance = new Fn();
      
      // Wrap the instance in a proxy that tracks dirty props
      resetDirtyProps(instance);
      return new Proxy(instance, {
        set: (target, property, value) => {
          markDirtyProp(instance, property);
          // Perform the actual property assignment
          target[property] = value;
          return true;
        },
      });
    },
    
    // Persist and changes made on `instance`
    update: (instance) => {
      // In real version we'd perform the necessary updates to
      // persist any "dirty" properties, here we just log them
      const dirtyPropertyNames = getDirtyProps(instance);
      dirtyPropertyNames.length === 0 ?
        console.log('Nothing to update') :
        console.log('Dirty properties:', dirtyPropertyNames);
      // All properties are now persisted, so clear the list
      resetDirtyProps(instance);
    },
  };
}
// --- App code --
// Initialise the orm
const orm = new ORM();
// Define our constructor function
function Person(name, dob) {
  this.name = name;
  this.dob = dob;
}
// Get an instance
const person1 = orm.getById(Person, 1);
// no dirty properties so `update` will do nothing
orm.update(person1);
// Get an instance
const person2 = orm.getById(Person, 2);
// Mutate some state
person2.name = 'new name';
// `update` will persist any dirty properties
orm.update(person2);
Output

You can jump to the latest bin by adding /latest to your URL

Dismiss x
public
Bin info
edwardsnjdpro
0viewers