Test case details

Preparation Code

<script src="http://dl.dropbox.com/u/7677927/oop-benchmark/lib/jsface.js"></script> <script src="http://dl.dropbox.com/u/7677927/oop-benchmark/lib/jsface.js"></script> <script src="http://dl.dropbox.com/u/7677927/oop-benchmark/lib/my.class.js"</script> <script src="http://dl.dropbox.com/u/7677927/oop-benchmark/lib/my.class.js"</script> <script src="http://dl.dropbox.com/u/7677927/oop-benchmark/lib/jrclass.js"</script> <script src="http://dl.dropbox.com/u/7677927/oop-benchmark/lib/jrclass.js"</script> <script src="http://dl.dropbox.com/u/7677927/oop-benchmark/lib/klass.js"></script> <script src="http://dl.dropbox.com/u/7677927/oop-benchmark/lib/klass.js"></script> <script src="http://dl.dropbox.com/u/7677927/oop-benchmark/lib/classy.js"></script> <script src="http://dl.dropbox.com/u/7677927/oop-benchmark/lib/classy.js"></script> <script src="http://dl.dropbox.com/u/7677927/oop-benchmark/lib/ptclass.js"</script> <script src="http://dl.dropbox.com/u/7677927/oop-benchmark/lib/ptclass.js"</script> <script> var inherit=function(){"use strict";var i,j,k,a="object",b="prototype",c="constructor",d=function(){},e=arguments,f=e[0],g=1==e.length?d:e[1],h=typeof f===a;return typeof g===a?(i=d,i[b]=g):(i=g,i[b]=h?f:new f),j=new i(i[b]),k=!j.hasOwnProperty(c),(k&&f===j[c]||k&&h)&&(j[c]=d),j[c][b]=j,j[c]}; /*jslint newcap:true */ var inherit0 = function() {         'use strict';         var len = arguments.length,                 parent = (len > 1) ? arguments[0] : function(){},                 body = arguments[len - 1];         body.prototype = Object.create(parent.prototype);         var prototype = new body(body.prototype);         prototype.constructor.prototype = prototype;         return prototype.constructor; }; </script>

Test cases

Test #1

var JSFacePerson = jsface.Class({   constructor: function(name){     this.name = name;   },   setAddress: function(country, city, street) {     this.country = country;     this.city = city;     this.street = street;   } }); var JSFaceFrenchGuy = jsface.Class(JSFacePerson, {   constructor: function(name) {     JSFaceFrenchGuy.$super.call(this, name);   },   setAddress: function(city, street) {     JSFaceFrenchGuy.$superp.setAddress.call(this, 'France', city, street);   } }); var JSFaceParisLover = jsface.Class(JSFaceFrenchGuy, {   constructor: function(name) {     JSFaceParisLover.$super.call(this, name);   },   setAddress: function(street) {     JSFaceParisLover.$superp.setAddress.call(this, 'Paris', street);   } }); var p1 = new JSFacePerson("John"); p1.setAddress("US", "MT", "CH"); var p2 = new JSFaceFrenchGuy("Leo"); p2.setAddress("MT", "CH"); var p3 = new JSFaceParisLover("Mary"); p3.setAddress("CH");

Test #2

var MyPerson = my.Class({   constructor: function(name){     this.name = name;   },   setAddress: function(country, city, street) {     this.country = country;     this.city = city;     this.street = street;   } }); var MyFrenchGuy = my.Class(MyPerson, {   constructor: function(name) {     MyFrenchGuy.Super.call(this, name);   },   setAddress: function(city, street) {     MyFrenchGuy.Super.prototype.setAddress.call(this, 'France', city, street);   } }); var MyParisLover = my.Class(MyFrenchGuy, {   constructor: function(name) {     MyParisLover.Super.call(this, name);   },   setAddress: function(street) {     MyParisLover.Super.prototype.setAddress.call(this, 'Paris', street);   } }); var p4 = new MyPerson("John"); p4.setAddress("US", "MT", "CH"); var p5 = new MyFrenchGuy("Leo"); p5.setAddress("MT", "CH"); var p6 = new MyParisLover("Mary"); p6.setAddress("CH");

Test #3

var JRPerson = JRClass.extend({   init: function(name){     this.name = name;   },   setAddress: function(country, city, street) {     this.country = country;     this.city = city;     this.street = street;   },   sayHello: function() {     console.log('I am ' + this.name + '. My address is ' +         this.country + ', ' + this.city + ', ' + this.street + '.');   } }); var JRFrenchGuy = JRPerson.extend({   init: function(name) {     this._super(name);   },   setAddress: function(city, street) {     this._super('France', city, street);   } }); var JRParisLover = JRFrenchGuy.extend({   init: function(name) {     this._super(name);   },   setAddress: function(street) {     this._super('Paris', street);   } }); var p7 = new JRPerson("John"); p7.setAddress("US", "MT", "CH"); var p8 = new JRFrenchGuy("Leo"); p8.setAddress("MT", "CH"); var p9 = new JRParisLover("Mary"); p9.setAddress("CH");

Test #4

var EnderPerson = klass(function(name) {   this.name = name; }) .methods({   setAddress: function(country, city, street) {     this.country = country;     this.city = city;     this.street = street;   } }); var EnderFrenchGuy = EnderPerson.extend(function(name) { }) .methods({   setAddress: function(city, street) {     this.supr('France', city, street);   } }); var EnderParisLover = EnderFrenchGuy.extend(function(name) { }) .methods({   setAddress: function(street) {     this.supr('Paris', street);   } }); var p10 = new EnderPerson("John"); p10.setAddress("US", "MT", "CH"); var p11 = new EnderFrenchGuy("Leo"); p11.setAddress("MT", "CH"); var p12 = new EnderParisLover("Mary"); p12.setAddress("CH");

Test #5

var ClassyPerson = Classy.$extend({   __init__: function(name){     this.name = name;   },   setAddress: function(country, city, street) {     this.country = country;     this.city = city;     this.street = street;   } }); var ClassyFrenchGuy = ClassyPerson.$extend({   __init__: function(name) {     this.$super(name);   },   setAddress: function(city, street) {     this.$super('France', city, street);   } }); var ClassyParisLover = ClassyFrenchGuy.$extend({   __init__: function(name) {     this.$super(name);   },   setAddress: function(street) {     this.$super('Paris', street);   } }); var p13 = new ClassyPerson("John"); p13.setAddress("US", "MT", "CH"); var p14 = new ClassyFrenchGuy("Leo"); p14.setAddress("MT", "CH"); var p15 = new ClassyParisLover("Mary"); p15.setAddress("CH");

Test #6

var PTClassPerson = PTClass.create({   initialize: function(name){     this.name = name;   },   setAddress: function(country, city, street) {     this.country = country;     this.city = city;     this.street = street;   } }); var PTClassFrenchGuy = PTClass.create(PTClassPerson, {   initialize: function($super, name) {     $super(name);   },   setAddress: function($super, city, street) {     $super('France', city, street);   } }); var PTClassParisLover = PTClass.create(PTClassFrenchGuy, {   initialize: function($super, name) {     $super(name);   },   setAddress: function($super, street) {     $super('Paris', street);   } }); var p16 = new PTClassPerson("John"); p16.setAddress("US", "MT", "CH"); var p17 = new PTClassFrenchGuy("Leo"); p17.setAddress("MT", "CH"); var p18 = new PTClassParisLover("Mary"); p18.setAddress("CH");

Test #7

var InheritPerson = inherit(function () {     this.constructor = function(name) {         this.name = name;     };     this.setAddress = function(country, city, street) {         this.country = country;         this.city = city;         this.street = street;     }; }); var InheritFrenchGuy = inherit(InheritPerson, function(base) {         this.constructor = function (name) {           base.constructor.call(this, name);         };             this.setAddress = function(city, street) {           base.setAddress.call(this, "France", city, street);         }; }); var InheritParisLover = inherit(InheritFrenchGuy, function(base) {     this.constructor= function (name) {         base.constructor.call(this, name);     };         this.setAddress = function(street) {         base.setAddress.call(this, "Paris", street);         return this;     }; }); var p19 = new InheritPerson("John"); p19.setAddress("US", "MT", "CH"); var p20 = new InheritFrenchGuy("Leo"); p20.setAddress("MT", "CH"); var p21 = new InheritParisLover("Mary"); p21.setAddress("CH");

Test #8

var InheritPerson0 = inherit0(function () {         this.constructor = function(name) {             this.name = name;         };         this.setAddress = function(country, city, street) {             this.country = country;             this.city = city;             this.street = street;         };     });         var InheritFrenchGuy0 = inherit0(InheritPerson0, function(base) {             this.constructor = function (name) {               base.constructor.call(this, name);             };                     this.setAddress = function(city, street) {               base.setAddress.call(this, "France", city, street);             };     });         var InheritParisLover0 = inherit0(InheritFrenchGuy0, function(base) {         this.constructor= function (name) {             base.constructor.call(this, name);         };                 this.setAddress = function(street) {             base.setAddress.call(this, "Paris", street);             return this;         };     }); var t1 = new InheritPerson0("John"); t1.setAddress("US", "MT", "CH"); var t2 = new InheritFrenchGuy0("Leo"); t2.setAddress("MT", "CH"); var t3 = new InheritParisLover0("Mary"); t3.setAddress("CH");