Test case details

Preparation Code

<script> //1 var circleFns = { area: function() { return Math.PI * this.radius * this.radius; }, grow: function() { this.radius++; }, shrink: function() { this.radius--; } } //2 var asCircle = function() { this.area = function() { return Math.PI * this.radius * this.radius; }; this.grow = function() { this.radius++; }; this.shrink = function() { this.radius--; }; } //3 var asCircleCached = (function() { var area = function() { return Math.PI * this.radius * this.radius; }; var grow = function() { this.radius++; }; var shrink = function() { this.radius--; }; return function() { this.area = area, this.grow = grow, this.shrink = shrink; } })(); var asCircleCachedPassedObj = (function() { var area = function() { return Math.PI * this.radius * this.radius; }; var grow = function() { this.radius++; }; var shrink = function() { this.radius--; }; return function(obj) { var proto = obj.prototype; proto.area = area, proto.grow = grow, proto.shrink = shrink; } })(); var asCircleCachedPassedProto = (function() { var area = function() { return Math.PI * this.radius * this.radius; }; var grow = function() { this.radius++; }; var shrink = function() { this.radius--; }; return function(proto) { proto.area = area, proto.grow = grow, proto.shrink = shrink; } })(); //4 Function.prototype.curry = function() { var fn = this; var args = [].slice.call(arguments, 0); return function() { return fn.apply(this, args.concat([].slice.call(arguments, 0))); } } //4 var asCircleCachedAndCurried = (function() { var area = function() { return Math.PI * this.radius * this.radius; }; var grow = function(growBy) { this.radius += growBy; }; var shrink = function(shrinkBy) { this.radius -= shrinkBy; }; return function(options) { this.area = area, this.grow = grow.curry(options['growBy']), this.shrink = shrink.curry(options['shrinkBy']) } })(); //5 var asCircleWithOptions = function(options) { this.area = function() { return Math.PI * this.radius * this.radius; }; this.grow = function() { this.radius += options.growBy; }; this.shrink = function() { this.radius -= options.shrinkBy; }; } //6 var CircleComponent = function(circle, options) { circle.area = function() { return Math.PI * circle.radius * circle.radius; }; circle.grow = function() { circle.radius += options.growBy; }; circle.shrink = function() { circle.radius -= options.shrinkBy; }; }; //set up test constructor var CircularObject = function(radius) { this.radius = radius }; </script>

Test cases

Test #1

for (var k in circleFns) { if (circleFns.hasOwnProperty(k)) { CircularObject.prototype[k] = circleFns[k] }; } var obj = new CircularObject(4); obj.shrink();

Test #2

asCircle.call(CircularObject.prototype); var obj = new CircularObject(4); obj.shrink();

Test #3

asCircleCached.call(CircularObject.prototype); var obj = new CircularObject(4); obj.shrink();

Test #4

asCircleCachedAndCurried.call( CircularObject.prototype, { growBy: 2, shrinkBy: 2 }); var obj = new CircularObject(4); obj.shrink();

Test #5

asCircleWithOptions.call( CircularObject.prototype, { growBy: 2, shrinkBy: 2 }); var obj = new CircularObject(4); obj.shrink();

Test #6

var obj = new CircularObject(4); CircleComponent(obj, { growBy: 2, shrinkBy: 2 }); obj.shrink();

Test #7

asCircleCachedPassedObj(CircularObject); var obj = new CircularObject(4); obj.shrink();

Test #8

asCircleCachedPassedProto(CircularObject.prototype); var obj = new CircularObject(4); obj.shrink();