JS inheritance test

Benchmark created by Bob Spryn on


Description

Demonstrating two different methods of inheritance. Brought about by this article in hacker news:

Wanted to examine it based on my own coding usage (a couple levels of single inheritance).

I was using crockford's method (so called "real" prototypical inheritance), but according to Ashkenas this is a frowned upon model these days. The claim is that its much slower. In my test below it seems to be faster, but I'm fairly sure I'm missing something.

Both tests are building an end object with two prototype methods from two different parents.

End objects

Preparation HTML

<script>
  MY = {};
  
  // Used for crockford inheritance
  MY.create = function(o) {
   function F() {};
   F.prototype = o;
   return new F();
  };
  
  var __hasProp = Object.prototype.hasOwnProperty;
  // used for Ashkenas Inheritance (via classes.js in coffeescript)
  MY.inherits = function(child, parent) {
   for (var key in parent) {
    if (__hasProp.call(parent, key)) child[key] = parent[key];
   }
  
   function ctor() {
    this.constructor = child;
   }
   ctor.prototype = parent.prototype;
   child.prototype = new ctor;
   child.__super__ = parent.prototype;
   return child;
  };
  
  // setup for Ashkenas Inheritance
  MY.base = function() {};
  MY.base.prototype.monkey = function() {
   console.log("monkey")
  }
  
  // setup for Crockford inheritance
  MY.realbase = {
   monkey: function() {
    console.log("monkey")
   }
  }
</script>

Test runner

Ready to run.

Testing in
TestOps/sec
Crockford Inheritance
var i = 100;
var newobject;
while (i--) {
 newobject = MY.create(MY.realbase);
 newobject.othermethod = function() {};
 window.otherobject = MY.create(newobject);
}
ready
Ashkenas Inheritance
var i = 100;
var newobject;
while (i--) {
 newobject = function() {};
 MY.inherits(newobject, MY.base);
 newobject.prototype.othermethod = function() {};
 window.instance = new newobject;
}
ready

Revisions

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