Object.create vs. new (v16)

Revision 16 of this benchmark created by Travis Smith on


Preparation HTML

<script>
  Object.defineProperties(Object.prototype, {
    _create: {
      value: function(state) {
        var This = this.constructor;
        if (This.prototype !== this && this.hasOwnProperty('constructor')) This.prototype = this;
        return new This(state);
      },
      writable: true,
      configurable: true
    },
    _create2: {
      value: function(state) {
        var obj = state;
        obj.__proto__ = this;
        return obj;
      },
      writable: true,
      configurable: true
    },
    constructor: {
      value: function(state) {
        for (var name in state) this[name] = state[name]
      },
      writable: true,
      configurable: true
    }
  });
object$ = Object.prototype;
Object.create2 = function(proto){
    var obj = {};
    obj.__proto__ = proto;
    return obj;
}
</script>

Setup

function MyClass(x, y) {
    this.x = x;
    this.y = y;
  }
  
  var MyProtoClass = {
    init: (function(x, y) {
      this.x = x;
      this.y = y;
      return this;
    }),
    x: 0,
    y: 0
  };
  
  function doSomething(obj) {
    var x = obj.x + obj.y,
        y = obj.x * obj.y,
        z = obj.x - obj.y;
  
    return x * y * z;
  }
  
  var x = 0 | (Math.random() * 10000),
      y = 0 | (Math.random() * 10000);

Test runner

Ready to run.

Testing in
TestOps/sec
new operator
var obj = new MyClass(x, y);
doSomething(obj);
ready
Object.create().init()
var obj = Object.create(MyProtoClass).init(x, y);
doSomething(obj);
ready
Object.create()
//See if it might be faster by not calling the init function.
var obj = Object.create(MyProtoClass);
obj.x = x;
obj.y = y;
doSomething(obj);
ready
prototype._create()
var obj = object$._create({
  x: x,
  y: y
});
doSomething(obj);
ready
prototype._create2() by __proto__
var obj = object$._create2({
  x: x,
  y: y
});
doSomething(obj);
ready
Object.create2 by __proto__
var obj = Object.create2(MyProtoClass);
obj.x = x;
obj.y = y;
doSomething(obj);
ready
Object.create3
var obj = Object.create3(MyProtoClass);
obj.x = x;
obj.y = y;
doSomething(obj);
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.