Editing JavaScript Object Oriented Libraries Benchmark This edit will create a new revision. Your details (optional) Name Email (won’t be displayed; might be used for Gravatar) URL Test case details Title * Published (uncheck if you want to fiddle around before making the page public) Description (in case you feel further explanation is needed)(Markdown syntax is allowed) === FULL TEST == MooTools and Ext Core are removed because they add extra information into native classes. They slow down other libraries. Ext Core OOP is fast, MooTools OOP is super slow! TODO: - Add YUI Are you a spammer? (just answer the question) Preparation code Preparation code HTML (this will be inserted in the <body> of a valid HTML5 document in standards mode) (useful when testing DOM operations or including libraries) <script src="https://raw.github.com/tnhu/jsface/master/jsface.js"> </script> <script src="https://raw.github.com/jiem/my-class/master/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/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/ptclass.js"> </script> <script src="https://raw.github.com/javascript/augment/master/augment.js"> </script> <script src="http://cdn.sencha.com/ext-4.1.1a-gpl/builds/ext-foundation.js"> </script> <script src="https://raw.github.com/torworx/oxygen.js/master/oxygen.js"> </script> <script> var __hasProp = {}.hasOwnProperty, __extends = 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; }; </script> Include JavaScript libraries as follows: <script src="//cdn.ext/library.js"></script> Define setup for all tests (variables, functions, arrays or other objects that will be used in the tests) (runs before each clocked test loop, outside of the timed code region) (e.g. define local test variables, reset global variables, clear canvas, etc.) (see FAQ) Define teardown for all tests (runs after each clocked test loop, outside of the timed code region) (see FAQ) Code snippets to compare Test 1 Title Async (check if this is an asynchronous test) Code var Person = jsface.Class({ constructor: function(name) { this.name = name; }, setAddress: function(country, city, street) { this.country = country; this.city = city; this.street = street; } }); var FrenchGuy = jsface.Class(Person, { constructor: function(name) { FrenchGuy.$super.call(this, name); }, setAddress: function(city, street) { FrenchGuy.$superp.setAddress.call(this, 'France', city, street); } }); var ParisLover = jsface.Class(FrenchGuy, { constructor: function(name) { ParisLover.$super.call(this, name); }, setAddress: function(street) { ParisLover.$superp.setAddress.call(this, 'Paris', street); } }); 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"); Test 2 Title Async (check if this is an asynchronous test) Code var Person = my.Class({ constructor: function(name) { this.name = name; }, setAddress: function(country, city, street) { this.country = country; this.city = city; this.street = street; } }); var FrenchGuy = my.Class(Person, { constructor: function(name) { FrenchGuy.Super.call(this, name); }, setAddress: function(city, street) { FrenchGuy.Super.prototype.setAddress.call(this, 'France', city, street); } }); var ParisLover = my.Class(FrenchGuy, { constructor: function(name) { ParisLover.Super.call(this, name); }, setAddress: function(street) { ParisLover.Super.prototype.setAddress.call(this, 'Paris', street); } }); var p4 = new Person("John"); p4.setAddress("US", "MT", "CH"); var p5 = new FrenchGuy("Leo"); p5.setAddress("MT", "CH"); var p6 = new ParisLover("Mary"); p6.setAddress("CH"); Test 3 Title Async (check if this is an asynchronous test) Code var Person = JRClass.extend({ init: function(name) { this.name = name; }, setAddress: function(country, city, street) { this.country = country; this.city = city; this.street = street; } }); var FrenchGuy = Person.extend({ init: function(name) { this._super(name); }, setAddress: function(city, street) { this._super('France', city, street); } }); var ParisLover = FrenchGuy.extend({ init: function(name) { this._super(name); }, setAddress: function(street) { this._super('Paris', street); } }); var p7 = new Person("John"); p7.setAddress("US", "MT", "CH"); var p8 = new FrenchGuy("Leo"); p8.setAddress("MT", "CH"); var p9 = new ParisLover("Mary"); p9.setAddress("CH"); Test 4 Title Async (check if this is an asynchronous test) Code var Person = klass(function(name) { this.name = name; }).methods({ setAddress: function(country, city, street) { this.country = country; this.city = city; this.street = street; } }); var FrenchGuy = Person.extend(function(name) {}).methods({ setAddress: function(city, street) { this.supr('France', city, street); } }); var ParisLover = FrenchGuy.extend(function(name) {}).methods({ setAddress: function(street) { this.supr('Paris', street); } }); var p10 = new Person("John"); p10.setAddress("US", "MT", "CH"); var p11 = new FrenchGuy("Leo"); p11.setAddress("MT", "CH"); var p12 = new ParisLover("Mary"); p12.setAddress("CH"); Test 5 Title Async (check if this is an asynchronous test) Code var Person = Classy.$extend({ __init__: function(name) { this.name = name; }, setAddress: function(country, city, street) { this.country = country; this.city = city; this.street = street; } }); var FrenchGuy = Person.$extend({ __init__: function(name) { this.$super(name); }, setAddress: function(city, street) { this.$super('France', city, street); } }); var ParisLover = FrenchGuy.$extend({ __init__: function(name) { this.$super(name); }, setAddress: function(street) { this.$super('Paris', street); } }); var p13 = new Person("John"); p13.setAddress("US", "MT", "CH"); var p14 = new FrenchGuy("Leo"); p14.setAddress("MT", "CH"); var p15 = new ParisLover("Mary"); p15.setAddress("CH"); Test 6 Title Async (check if this is an asynchronous test) Code var Person = PTClass.create({ initialize: function(name) { this.name = name; }, setAddress: function(country, city, street) { this.country = country; this.city = city; this.street = street; } }); var FrenchGuy = PTClass.create(Person, { initialize: function($super, name) { $super(name); }, setAddress: function($super, city, street) { $super('France', city, street); } }); var ParisLover = PTClass.create(FrenchGuy, { initialize: function($super, name) { $super(name); }, setAddress: function($super, street) { $super('Paris', street); } }); var p16 = new Person("John"); p16.setAddress("US", "MT", "CH"); var p17 = new FrenchGuy("Leo"); p17.setAddress("MT", "CH"); var p18 = new ParisLover("Mary"); p18.setAddress("CH"); Test 7 Title Async (check if this is an asynchronous test) Code var Person = (function() { function Person(name) { this.name = name; } Person.prototype.setAddress = function(country, city, street) { this.country = country; this.city = city; this.street = street; }; return Person; })(); var FrenchGuy = (function(_super) { __extends(FrenchGuy, _super); function FrenchGuy(name) { FrenchGuy.__super__.constructor.call(this, name); } FrenchGuy.prototype.setAddress = function(city, street) { return FrenchGuy.__super__.setAddress.call(this, "France", city, street); }; return FrenchGuy; })(Person); var ParisLover = (function(_super) { __extends(ParisLover, _super); function ParisLover(name) { ParisLover.__super__.constructor.call(this, name); } ParisLover.prototype.setAddress = function(street) { return ParisLover.__super__.setAddress.call(this, "Paris", street); }; return ParisLover; })(FrenchGuy); 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"); Test 8 Title Async (check if this is an asynchronous test) Code 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 IndianGuy = Person.augment(function(Person, uber) { var setAddress = uber.setAddress; this.setAddress = function(city, street) { setAddress.call(this, "India", city, street); }; return IndianGuy; function IndianGuy(name) { Person.call(this, name); } }); var MumbaiLover = IndianGuy.augment(function(IndianGuy, uber) { var setAddress = uber.setAddress; this.setAddress = function(street) { setAddress.call(this, "Mumbai", street); }; return MumbaiLover; function MumbaiLover(name) { IndianGuy.call(this, name); } }); var p1 = new Person("Barack Obama"); p1.setAddress("USA", "Washington, D.C.", "Pennsylvania Avenue"); var p2 = new IndianGuy("Mahatma Gandhi"); p2.setAddress("Ahmedabad", "Ashram Road"); var p3 = new MumbaiLover("Aadit M Shah"); p3.setAddress("L.D. Ruparel Marg"); Test 9 Title Async (check if this is an asynchronous test) Code Ext.define('Person', { constructor: function(name) { this.name = name; }, setAddress: function(country, city, street) { this.country = country; this.city = city; this.street = street; } }); Ext.define('ChinaGuy', { extend: 'Person', constructor: function() { this.callParent(arguments); }, setAddress: function(city, street) { this.callParent(['China', city, street]); } }); Ext.define('BeiJingLover', { extend: 'ChinaGuy', constructor: function(name) { this.callParent(arguments); }, setAddress: function(street) { this.callParent(['BeiJing', street]); } }); var p1 = new Person("John"); p1.setAddress("US", "MT", "CH"); var p2 = new ChinaGuy("Leo"); p2.setAddress("MT", "CH"); var p3 = new BeiJingLover("Mary"); p3.setAddress("CH"); Test 10 Title Async (check if this is an asynchronous test) Code var Person = Oxy.define({ constructor: function(name) { this.name = name; }, setAddress: function(country, city, street) { this.country = country; this.city = city; this.street = street; } }); var ChinaGuy = Oxy.define({ extend: Person, constructor: function() { Person.call(this) }, setAddress: function(city, street) { ChinaGuy.$super.setAddress('China', city, street); } }); var BeiJingLover = Oxy.define({ extend: ChinaGuy, constructor: function(name) { ChinaGuy.call(this, name); }, setAddress: function(street) { BeiJingLover.$super.setAddress('BeiJing', street); } }); var p1 = new Person("John"); p1.setAddress("US", "MT", "CH"); var p2 = new ChinaGuy("Leo"); p2.setAddress("MT", "CH"); var p3 = new BeiJingLover("Mary"); p3.setAddress("CH"); Test 11 Title Async (check if this is an asynchronous test) Code var Person = Oxy.extend(Object, 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 ChinaGuy = Oxy.extend(Person, function(Person, parent) { this.setAddress = function(city, street) { parent.setAddress('China', city, street); } return ChinaGuy; function ChinaGuy() { Person.call(this) } }); var BeiJingLover = Oxy.extend(ChinaGuy, function(ChinaGuy, parent) { this.setAddress = function(street) { parent.setAddress('BeiJing', street); } return BeijingLover; function BeijingLover(name) { ChinaGuy.call(this, name); } }); var p1 = new Person("John"); p1.setAddress("US", "MT", "CH"); var p2 = new ChinaGuy("Leo"); p2.setAddress("MT", "CH"); var p3 = new BeiJingLover("Mary"); p3.setAddress("CH"); Test 12 Title Async (check if this is an asynchronous test) Code var personProto = Person.prototype; var personSetAddress = personProto.setAddress = function(country, city, street) { this.country = country; this.city = city; this.street = street; }; function Person(name) { this.name = name; } var frenchProto = FrenchGuy.prototype = Object.create(personProto); var frenchSetAddress = frenchProto.setAddress = function(city, street) { personSetAddress.call(this, "France", city, street); }; frenchProto.constructor = FrenchGuy; function FrenchGuy(name) { Person.call(this, name); } var parisProto = ParisLover.prototype = Object.create(frenchProto); parisProto.setAddress = function(street) { frenchSetAddress.call(this, "Paris", street); }; parisProto.constructor = 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");