Object.create vs. new (v18)

Revision 18 of this benchmark created by Cybermage83 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;
}
Object.create3 = (function() {
    var Object = function() {};
    return function (prototype) {
        if (arguments.length > 1) {
            throw new Error('Second argument not supported');
        }
        if (typeof prototype != 'object') {
            throw new TypeError('Argument must be an object');
        }
        Object.prototype = prototype;
        var result = new Object();
        Object.prototype = null;
        return result;
    };
})();
var objF = function (prop){return Object.create(prop);}
</script>

Setup

function Actual (){}
  function MyClass(x, y) {
    //this.x = x;
    //this.y = y;
   Actual.prototype = {x:x,y:y};
  return new Actual();
  }
  
  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);
  
  var OBJ = {x: x, y :0};

Test runner

Ready to run.

Testing in
TestOps/sec
Object.create
var obj = objF(OBJ);
doSomething(obj);
ready
new operator
var obj = 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.