martinvigo
martinvigo

Reputation: 143

Getters and setters in javascript

I am starting with javascript and specially with the OOP pattern.

My question is simple. In a setter, is there a way to keep the same name for the parameter and the private class variable? I have looked everywhere but couldn't find anyone mentioning it, just examples with different var names. I am very picky with my code and I have having to give it two different names.

Taking the example from http://ejohn.org/blog/javascript-getters-and-setters/

function Field(val){
    this.value = val;
}
Field.prototype = {
    get value(){
        return this._value;
    },
    set value(val){
        this._value = val;
    }
};

you can see in the setter the parameter is val but the property is actually value. Since it is javascript I cannot simply do this.value=value because "this" would make it public. value=value would refer both to the parameter (and would be very weird). Is there really no way to do this? If not, is there any "best practice" for this situation? I guess underscore could be valid but I am just picky so just want to make sure there is no other way.

Thank you!

Upvotes: 5

Views: 6142

Answers (2)

Imp
Imp

Reputation: 8609

You can use closure to hide the variable.

function MyClass {
  var value;

  this.getValue = function() {
    return value;
  }

  this.setValue = function(val) {
    value = val;
  }

}

After the constructor MyClass finishes, the value field is unacessible, as it was scoped only to this constructor (function). So we may say that value is a private field. However, the methods getValue() and setValue() are publicly accessible from the constructed object and they keep reference to the variable scope of MyClass, thus they can still manipulate value.

Upvotes: 5

BishopZ
BishopZ

Reputation: 6378

Using closures:

(function(exports){

    exports.field = {};
    var _value = '123';

    exports.field.get = function(){
        return _value;
    }

    exports.field.set = function(val){
        _value = val;
    }

})(window);

console.log(field.get());

Here is a good tutorial on closures in JS.

Upvotes: 1

Related Questions