Property Getter / Setter Techniques (v23)

Revision 23 of this benchmark created by ppold on


Description

Testing various techniques for creating getters / setters in JavaScript.

Testing a variation of 'Combined getter / setter method'. I had heard that using the 'arguments' object requires a heavy performance hit

Preparation HTML

<script>
  var global = this;
  
  (function() {
    global.obj = {
      prop: 0
    };
  
    global.obj1 = {
      _prop: 0,
      getProp: function() {
        return this._prop;
      },
      setProp: function(value) {
        this._prop = value;
      }
    };
  
    global.obj2 = {
      _prop: 0,
      get prop() {
        return this._prop;
      },
      set prop(value) {
        this._prop = value;
      }
    };
  
  
    global.obj3 = {
      _prop: 0
    }
  
  
    Object.defineProperty(global.obj3, "prop", {
      get: function() {
        return this._prop;
  
      },
      set: function(val) {
        this._prop = val;
      }
    });
  
    global.obj4 = {
      _prop: 0
    }
  
  
    global.obj4.__defineGetter__("prop", function() {
      return this._prop;
    });
  
    global.obj4.__defineSetter__("prop", function(val) {
      this._prop = val;
    });
  
    global.obj5 = {
      _prop: 0,
      prop: function(value) {
        if (value !== void 0)
          this._prop = value;
        else
          return this._prop;
      }
    };
  
    global.obj6 = {
      attributes: {
        prop: 0
      },
      get: function(name) {
        return this.attributes[name];
      },
      set: function(name, value) {
        this.attributes[name] = value;
      }
    };

    global.obj7 = {
      _prop: 0,
      get: function(key) {
        return this[key];
      },
      set: function(key, value) {
        this[key] = value;
      }
    };

global.obj8 = {};
  Object.defineProperty(global.obj8, "getProp", {
   value: function() {
    return this._prop;
  
   }
  });
  Object.defineProperty(global.obj8, "setProp", {
   value: function(val) {
    this._prop = val;
   }
  });
global.obj9 = {
      prop: 0,
      setProp: function(value) {
        this.prop = value;
      }
    };
  })();
</script>

Test runner

Ready to run.

Testing in
TestOps/sec
Getter / setter methods
var obj1 = global.obj1; obj1.setProp(obj1.getProp() + 1);
ready
get / set syntax
var obj2 = global.obj2; obj2.prop = obj2.prop + 1;
ready
Object.defineProperty
var obj3 = global.obj3; obj3.prop = obj3.prop + 1;
ready
__defineGetter__
var obj4 = global.obj4; obj4.prop = obj4.prop + 1;
ready
Regular property
++global.obj.prop;
ready
Combined getter / setter method
var obj5 = global.obj5; obj5.prop(obj5.prop() + 1);
ready
Generic get/set methods (with key)
var obj7 = global.obj7; obj7.set('_prop', obj7.get('_prop') + 1);
ready
defineProperty function
var obj8 = global.obj8; obj8.setProp(obj8.getProp() + 1);
ready
attribute
var obj6 = global.obj6; obj6.set('prop', obj6.get('prop') + 1);
ready
with block
with(global.obj) { ++prop; }
ready
Regular property -1 attribute level
++obj.prop;
ready
setter method only
var obj9 = global.obj9; obj9.setProp(obj9.prop + 1);
ready

Revisions

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