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> Function.prototype.augment = function (klass) {     var uber = this.prototype;     var prototype = Object.create(uber);     var constructor = klass.call(prototype, this, uber);     if (typeof constructor !== "function") constructor = function () {};     prototype.constructor = constructor;     constructor.prototype = prototype;     return 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 Person = Object.augment(function () {     this.setAddress = function (country, city, street) {         this.country = country;         this.city = city;         this.street = street;     };     return Person;     function Person(name) {         this.name = name;     } }); var FrenchGuy = Person.augment(function (Person, uber) {     this.setAddress = function (city, street) {         uber.setAddress.call(this, "France", city, street);     };     return FrenchGuy;     function FrenchGuy(name) {         Person.call(this, name);     } }); var ParisLover = FrenchGuy.augment(function (FrenchGuy, uber) {     this.setAddress = function (street) {         uber.setAddress.call(this, "Paris", street);     };     return ParisLover;     function ParisLover(name) {         FrenchGuy.call(this, name);     } }); var p1 = new Person("John"); p1.setAddress("US", "MT", "CH"); var p2 = new FrenchGuy("Leo"); p2.setAddress("MT", "CH"); var p3 = new ParisLover("Mary"); p3.setAddress("CH");