Access default getter/setter for JavaScript object

defineproperty, getter, javascript, setter

Solution

As far as I know, a property either has a value (data property), or it has getter/setter (accessor property): it cannot have both. Use a local variable under closure, or another property, as an underlying storage for properties where you have a getter/setter defined.

For example,

(function() {
    var value;
    Object.defineProperty(obj, 'foo', {
      set: function(val) {
        if (useCustom) {
          value = doCustomProcessing(obj, 'foo', val);
        } else {
          value = val;
        }
      },
      get: function() { return value; }
    });
})();

Problem

JavaScript getters and setters can be overridden for specific properties using `Object.defineProperty`. Is there some way to access the default getter/setter (i.e. the function used if the getter/setter has not been overwritten)? In my custom setter I want to have special processing in some cases, but use the default processing in others. I tried: ``` Object.defineProperty(obj, 'foo', 'set': function(val) { if (useCustom) { doCustomProcessing(obj, 'foo', val); } else { obj['foo'] = val; } } ); ``` Unfortunately this leads to a stack overflow since `obj['foo'] = val;` causes the custom setter to be invoked. So I'd like to find a way to set the `foo` property of `obj` using the default setter. Is this possible?

Original source

Related problems