closures vs objects vs object literals vs prototype (v5)

Revision 5 of this benchmark created by Dan W on


Setup

//prototype
    var AnimalA = function(name) {
        this.name = name;
        this.nick = null;
        };
    AnimalA.prototype.speak = function() {
      alert(this.name + ' spoke');
    };
    AnimalA.prototype.setNick = function(a) {
      this.nick = a;
    };
    AnimalA.prototype.getNick = function() {
      alert(this.nick);
    };
    
    //closures
    var AnimalB = function(petName) {
        var nick = null;
        return {
          name: petName,
          speak: function() {
            alert(this.name + ' spoke');
          },
          setNick: function(a) {
            nick = a;
          },
          getNick: function() {
            alert(nick);
          }
        };
        };
    
    //Objects
    var AnimalC = function(name) {
        this.name = name;
        var nick = null;
        this.speak = function() {
          alert(this.name + ' spoke');
        };
        this.setNick = function(a) {
          nick = a;
        };
        this.getNick = function() {
          alert(nick);
        };
        };
    
    //Object literals
    
    var AnimalD = {
      name: name,
      nick: null,
    
      setName: function(petName) {
        this.name = petName;
      },
    
      speak: function() {
        alert(this.name + ' spoke');
      },
    
      setNick: function(a) {
        this.nick = a;
      },
    
      getNick: function() {
        alert(this.nick);
      }
    };
    
    var clone = (function() {
      function Clone() {}
      return function(obj) {
        Clone.prototype = obj;
        return new Clone();
      };
    }());

Test runner

Ready to run.

Testing in
TestOps/sec
prototype
var cat = new AnimalA('garfield');
cat.speak();
cat.setNick('iring');
cat.getNick();

var dog = new AnimalA('odie');
dog.speak();
dog.setNick('iro');
dog.getNick();

cat.speak();
cat.setNick('iring2');
cat.getNick();
ready
closures
var cat = new AnimalB('garfield');
cat.speak();
cat.setNick('iring');
cat.getNick();

var dog = new AnimalB('odie');
dog.speak();
dog.setNick('iro');
dog.getNick();

cat.speak();
cat.setNick('iring2');
cat.getNick();
ready
objects
var cat = new AnimalC('garfield');
cat.speak();
cat.setNick('iring');
cat.getNick();

var dog = new AnimalC('odie');
dog.speak();
dog.setNick('iro');
dog.getNick();

cat.speak();
cat.setNick('iring2');
cat.getNick();
ready
object literals
var cat = clone(AnimalD);
cat.setName('garfield');
cat.speak();
cat.setNick('iring');
cat.getNick();

var dog = clone(AnimalD);
dog.setName('odie');
dog.speak();
dog.setNick('iro');
dog.getNick();

cat.speak();
cat.setNick('iring2');
cat.getNick();
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.