Test case details

Preparation Code

<script src="http://dl.dropbox.com/u/7677927/oop-benchmark/lib/jrclass.js"></script> <script src="http://raptorjs.org/dist/raptor.min.js" type="text/javascript"></script> <script src="http://indigounited.com/dejavu/dejavu.js"></script> <script src="http://dl.dropbox.com/u/7677927/oop-benchmark/lib/my.class.js"></script> <script src="https://rawgithub.com/tnhu/jsface/v2.1.1/jsface.js"></script> <script> var augment = (function (bind, call) {     "use strict";     var bindable = Function.bindable = bind.bind(bind);     var callable = Function.callable = bindable(call);     var arrayFrom = Array.from = callable(Array.prototype.slice);     var ownPropertyOf = Object.ownPropertyOf = callable(Object.hasOwnProperty);     //Object.defineProperty(Function.prototype, "augment", augmentDescriptor);     Object.defineProperty(Object.prototype, "augment", { value: augment });     return callable(augment);     function augment(body) {         var base = typeof this === "function" ? this.prototype : this;         var prototype = Object.create(base);         body.apply(prototype, arrayFrom(arguments, 1).concat(base));         if (!ownPropertyOf(prototype, "constructor")) return prototype;         var constructor = prototype.constructor;         constructor.prototype = prototype;         return constructor;     } }(Function.bind, Function.call)); Function.prototype.new = function () {      function functor() { return constructor.apply(this, args); }      var args = Array.prototype.slice.call(arguments);      functor.prototype = this.prototype;      var constructor = this;      return new functor; }; function inherit() {     var len = arguments.length;     var parent = (len > 1) ? arguments[0] : function(){};     var body = arguments[len - 1];     body.prototype = parent.prototype;     var constructor = new body(parent.prototype);     if (!constructor.hasOwnProperty("init")) constructor.init=function(){};     constructor.init.prototype = constructor;     return constructor.init; } </script> <script> (function(){function u(){}function f(){}var i=typeof global!="undefined",r,o,y;String.prototype.format||(r={},String.prototype.format=function(){for(var t=this,i=arguments,n=i.length;--n>=0;)t=t.replace(r[n]||(r[n]=RegExp("\\{"+n+"\\}","gm")),i[n]);return t},String.format||(String.format=function(n){for(var i=arguments,t=i.length;--t;)n=n.replace(r[t-1]||(r[t-1]=RegExp("\\{"+(t-1)+"\\}","gm")),i[t]);return n}));var t=Function.prototype,l=Array.prototype,e=l.forEach,a=Object.defineProperty,v=typeof Object.defineProperties=="function",n={};if(n=n.__proto__===Object.prototype,n)try{n={},n.__proto__={Object:1},n=n.Object===1}catch(b){n=!1}if(typeof Object.getPrototypeOf!="function"&&(Object.getPrototypeOf=n?function(n){return n.__proto__}:function(n){return n==null||!n.constructor||n===Object.prototype?null:n.constructor.prototype===n?Object.prototype:n.constructor.prototype}),e||(l.forEach=e=function(n,t){for(var i=0,r=this.length;i<r;++i)n.call(t||this,this[i],i,this)}),t.fastClass=function(n){var f=this,e=this.prototype,u,r;return n=n||function(){this.constructor=function(){f.apply(this,arguments)}},n.prototype=e,u=new n(e,this),u.hasOwnProperty("constructor")||(u.constructor=function(){f.apply(this,arguments)}),r=u.constructor,r.prototype=u,n=null,arguments.length>1&&t.define.apply(r,arguments),r.constructor=r,r},t.inheritWith=n?function(n){var u=this,r=(typeof n=="function"?n.call(this,this.prototype,this):n)||{},i=r.hasOwnProperty("constructor")?r.constructor:function(){u.apply(this,arguments)};return i.prototype=r,r.__proto__=this.prototype,n=null,arguments.length>1&&t.define.apply(i,arguments),i.constructor=i,i}:function(n){var e=this,r=(typeof n=="function"?n.call(this,this.prototype,this):n)||{},f=r.hasOwnProperty("constructor")?r.constructor:function(){e.apply(this,arguments)},o;return u.prototype=this.prototype,f.prototype=o=new u,n=r,t.define.apply(f,arguments),f.constructor=f,f},t.define=function(n,t){var f=this,r=this.prototype,s=n,o;if(n){typeof n=="function"&&(n=n.call(r,this.prototype,this));for(o in n)r[o]=n[o]}return n=null,(arguments.length>2||t)&&(r.hasOwnProperty("__mixins__")||(v?a(r,"__mixins__",{enumerable:!1,value:[],writeable:!1}).__mixins__.__hidden=!0:r.__mixins__=[]))&&e.call(arguments,function(n,t,e,o){if(o=typeof n=="function",o?(u.prototype=n.prototype,e=new n(r,f)):e=n,e){o&&r.__mixins__.push(n);for(var s in e)s!="constructor"&&s!="prototype"&&(r[s]=e[s])}}),this},Function.define=function(n,r){var f,u=n||function(){},e=arguments.length>1;return typeof n!="function"?(u=n.hasOwnProperty("constructor")?n.constructor:function(){},u.prototype=n,e=!0):(n=r,r=null),e&&t.define.apply(u,arguments),f=function(){Function.initMixins(this),u.apply(this,arguments)},f.prototype=u.prototype,f.constructor=f.prototype.constructor=u.constructor=u.prototype.constructor=f,f},t.defineStatic=function(n){if(n)for(var t in n)this[t]=n[t];return this},f.defineStatic({abstract:!0}),Function.abstract=function(n,t){var r=n||t?function(){typeof n=="function"&&n.apply(this,arguments),typeof t=="function"&&t.apply(this,arguments),typeof n=="string"||f()}.defineStatic({abstract:!0}):f;return r},Function.initMixins=function(t){if(t&&!t.__initMixins__){var r=t,e,o,u,f,s={};for(t.__initMixins__=1;r;)if(r=n?r.__proto__:Object.getPrototypeOf(r),r&&r.hasOwnProperty("__mixins__")&&(e=r.__mixins__)&&(o=e.length))for(u=0;f=e[u],u<o;u++)f in s||(s[f]=1,f.call(t,r,r.constructor));delete t.__initMixins__}},v){o={0:[Function,"initMixins","define","abstract"],1:[t,"fastClass","inheritWith","define","defineStatic"]};for(y in o)for(var s=o[y],p=s[0],h=1,c;c=s[h],h<s.length;h++)a(p,c,{enumerable:!1,value:p[c]})}})(); //# sourceMappingURL=FastClass.min.js.map </script>
var InheritPerson = inherit(function () {             this.init = 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.init = function (name) {                   base.init(name);                 };                             this.setAddress = function(city, street) {                   base.setAddress("France", city, street);                 };         });             var InheritParisLover = inherit(InheritFrenchGuy, function(base) {                         this.init= function (name) {                 base.init(name);             };                         this.setAddress = function(street) {                 base.setAddress("Paris", street);                 return this;             };         });             var AugmentPerson = Object.augment(function() {             this.constructor = function (name) {               this.nome = name;             };                     this.setAddress = function(country, city, street) {               this.country = country;               this.city = city;               this.street = street;             };           });                   var AugmentFrenchGuy = AugmentPerson.augment(function(base) {                     this.constructor = function (name) {               base.constructor(name);             };                     this.setAddress = function(city, street) {               base.setAddress("France", city, street);             };           });                   var AugmentParisLover = AugmentFrenchGuy.augment(function(base) {                     this.constructor = function (name) {               base.constructor(name);             };                     this.setAddress = function(street) {               base.setAddress.call(this,"Paris", street);               return this;             };           });             var JRPerson = JRClass.extend({         init: function(name) {           this.name = name;         },         setAddress: function(country, city, street) {           this.country = country;           this.city = city;           this.street = 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);           return this;         }       });                         var RaptorPerson = define.Class({                 init: function(name) {                     this.name = name;                 },                 setAddress: function(country, city, street) {                     this.country = country;                     this.city = city;                     this.street = street;                 }             });             var RaptorFrenchGuy = define.Class({superclass: RaptorPerson}, ['super'], function($super) {                 var superCtor = $super.constructor;                 var superSetAddress = $super.setAddress;                         function RaptorFrenchGuy(name) {                     superCtor.call(this, name);                 };                         RaptorFrenchGuy.prototype = {                     setAddress: function(city, street) {                         superSetAddress.call(this, 'France', city, street);                     }                 }                         return RaptorFrenchGuy;             });                     var RaptorParisLover = define.Class({superclass: RaptorFrenchGuy}, ['super'], function($super) {                 var superCtor = $super.constructor;                 var superSetAddress = $super.setAddress;                         function RaptorParisLover(name) {                     superCtor.call(this, name);                 };                         RaptorParisLover.prototype = {                     setAddress: function(street) {                         superSetAddress.call(this, 'Paris', street);                         return this;                     }                 }                         return RaptorParisLover;             });                     var FCPerson = Function.inheritWith(function() {         return {             constructor: function(name) {                     this.nome = name;             },             setAddress: function(country, city, street) {                     this.country = country;                     this.city = city;                     this.street = street;             }         }     });         var FCFrenchGuy = FCPerson.inheritWith(function(base, baseCtor){         return {             constructor: function(name) {               baseCtor.call(this, name);             },             setAddress: function(city, street) {               base.setAddress('France', city, street);             }         }       });           var FCParisLover = FCFrenchGuy.inheritWith(function(base, baseCtor){         return {             constructor: function(name) {               baseCtor.call(this, name);             },             setAddress: function(street) {               base.setAddress('Paris', street);               return this;             }         }       });           var dejavuClassPerson2 = dejavu.Class.declare({         initialize: function(name){           this.name = name;         },         setAddress: function(country, city, street) {           this.country = country;           this.city = city;           this.street = street;         }       }, true);           var dejavuClassFrenchGuy2 = dejavu.Class.declare({         $extends: dejavuClassPerson2,         initialize: function (name) {           dejavuClassPerson2.call(this, name);         },         setAddress: function(city, street) {           dejavuClassPerson2.prototype.setAddress.call(this, 'France', city, street);         }       }, true);           var dejavuClassParisLover2 = dejavu.Class.declare({         $extends: dejavuClassFrenchGuy2,         initialize: function (name) {           dejavuClassFrenchGuy2.call(this, name);         },         setAddress: function(street) {           dejavuClassFrenchGuy2.prototype.setAddress.call(this, 'Paris', street);           return this;         }       }, true);         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);               return this;             }           });         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);           return this;         }       });

Test cases

Test #1

var t1 = new InheritParisLover("Mary"); t1.setAddress("CH");

Test #2

var t2 = new AugmentParisLover("Mary"); t2.setAddress("CH");

Test #3

var t3 = new JRParisLover("Mary"); t3.setAddress("CH");

Test #4

var t4 = new RaptorParisLover("Mary"); t4.setAddress("CH");

Test #5

var t5 = new FCParisLover("Mary"); t5.setAddress("CH");

Test #6

var t6 = new dejavuClassParisLover2("Mary"); t6.setAddress("CH");

Test #7

var t7 = new MyParisLover("Mary"); t7.setAddress("CH");

Test #8

var t8 = new JSFaceParisLover("Mary"); t8.setAddress("CH");