Pregunta

Is it possible to have multiple parameters for Object.defineProperty setter function?

E.G.

var Obj = function() {
  var obj = {};
  var _joe = 17;

  Object.defineProperty(obj, "joe", {
    get: function() { return _joe; },
    set: function(newJoe, y) {
      if (y) _joe = newJoe;
    }
  });

  return obj;
}

I don't get any errors from the syntax, but I can't figure out how to call the setter function and pass it two arguments.

¿Fue útil?

Solución

Is it possible to have multiple parameters for Object.defineProperty setter function?

Yes, but it's not possible to invoke them (other than Object.getOwnPropertyDescriptor(obj, "joe").set(null, false)). A setter is invoked with the one value that is assigned to the property (obj.joe = "doe";) - you cannot assign multiple values at once.

If you really need them (for whatever reasons), better use a basic setter method (obj.setJoe(null, false)).

Otros consejos

I had a similar dilemma with setter method, so I ended with the object param:

  set size(param) {
    this.width = param.width;
    this.height = param.height;
  }

And I use it like:

this.size = {width: 800, height: 600};

Just an interesting thought.

var Joe = (function() {

    // constructor
    var JoeCtor = function() {

        if (!(this instanceof Joe)){
            throw new Error('Error: Use the `new` keyword when implementing a constructor function');
        }

        var _age = 17;

        // getter / setter for age
        Object.defineProperty(this, "age", {
            get: function() { return _age; },
            set: function(joeObj) {
                if (joeObj.assert) { 
                    _age = joeObj.value; 
                }
            }
        });

    };

    // static
    JoeCtor.ageUpdateRequest = function(canSet, newAge){
        return { assert: canSet, value: newAge }
    };

    return JoeCtor;

})();

myJoe = new Joe();

myJoe.age = Joe.ageUpdateRequest(true, 18);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top