Self-modifying Javascript objects

I thought it’d be interesting to consider Javascript objects which can modify their own behavior over time. A use case for this (what I’m doing) is pages of data, where data is first looked up, then cached in memory, then cleared. A simple case (demonstrated below) is memoization.

The following query will do an ajax lookup of some data:

function loadData() {
  var data;
 
  $.ajax({
    url: "blocks/" + this.block,
    async: false
  }).done(function(blockData) {
    data = blockData.split("\n")
    for (var i = 0; i < data.length; i++) {
      data[i] = data[i].split("\t")
    }
  });
 
  return data;
}
 
var x = {block: 'xabnh', getData: loadData}
 
x.getData();
Array[2501]

This shows how one might trigger caching the results. Once retrieved, the cached data is hidden within a closure, and the mechanism for retrieving data is updated. In the case of a memory manager, these pages are later cleared out by replacing the memoization function with a third function, which starts the process all over again.

var x = {block: 'xabnh', getData: memoize(loadData)}
 
function memoize(getData) {
  return function() {
    console.log('loading');
    var data = getData.apply(this);
    function savedData() {
      console.log('memoized');
      return data;
    }
    this.getData = savedData;
 
    return data;
  }
}
 
x.getData()
loading
Array[2501]
x.getData()
memoized
Array[2501]

There are a few downsides to this approach; data in the closure is hidden from inspection, the current state of the object is hidden, and can change quickly. A generalized approach to this problem might pass an object into the getData function to show state or trigger a debug mode.

Tags: ,

2 comments ↓

#1 Rhys Brett-Bowen on 07.18.13 at 2:00 pm

agreed, I used to do things similar to this if I needed to do some setup the first time a function was called. For example;

var obj = {
getCount: function() {
var count = 0;
this.getCount = function() {
return ++count;
}
return count;
}
};

Also useful if you want to setup some defaults, saves an if statement every time the function is called. I try to stay away from things like this now though as I use an Aspect Oriented (http://modernjavascript.blogspot.com/2013/06/aspect-oriented-programming-in.html) approach which decorates the function and replacing the function means I’ll lose the decoration

#2 Gary on 07.19.13 at 3:25 am

Interesting concept- I haven’t seen AOP applied to Javascript, thanks for sharing!

Leave a Comment

Current day month ye@r *