3

My question:


    var nsPreferences = {

    property1:"",

    get mPrefService()
        {
          return Components.classes["@mozilla.org/preferences-service;1"]
                           .getService(Components.interfaces.nsIPrefBranch);
        },

    setBoolPref: function (aPrefName, aPrefValue)
        {
          try 
            {
              this.mPrefService.setBoolPref(aPrefName, aPrefValue);
            }
          catch(e)
            {
            }
        },

    getBoolPref: function (aPrefName, aDefVal)// Prefs.jsで使用
        {
          try
            {
              return this.mPrefService.getBoolPref(aPrefName);
            }
          catch(e)
            {
              return aDefVal != undefined ? aDefVal : null;
            }
          return null;        // quiet warnings
        },


    };

In this object nsPreferences, what is this "get mPrefService(){}"? This is the first time I've seen this kind of syntax in javascript object. Would anyone tell me about this syntax?

  • They're getters and setters: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects#Defining_getters_and_setters – Blender Aug 02 '13 at 03:07
  • Have a look at http://stackoverflow.com/questions/5409372/does-javascript-have-get-set-keywords-like-c – Ranjith Ramachandra Aug 02 '13 at 03:13
  • @Blender,@Ranjith R :Is it equivalent to "*** : function(){***;return ***;},"? Is there any merit in using get syntax, other than making code smaller? – user2640929 Aug 02 '13 at 04:35
  • @user2640929: Sure. They let you modify properties nicely. You could do `foo.bar = -12` and `bar`'s setter would throw an error saying that `-12` is an invalid value. – Blender Aug 02 '13 at 04:55

1 Answers1

2

It's a getter function. It will look like a variable when you read it:

var someService = nsPreferences.mPrefService;

It calls that function without using the regular invocation parens. You can also use the set operator to create a "setter" function for the same property:

set mPrefService(val){
    this.actualVal = val;
},
nsPreferences.mPrefService = "service";
bfavaretto
  • 71,580
  • 16
  • 111
  • 150
  • i.e.you can write like this alternatively,can't you?: getmPrefService: function(){ return Components.classes["@mozilla.org/preferences-service;1"] .getService(Components.interfaces.nsIPrefBranch); } – user2640929 Aug 02 '13 at 04:14
  • If you use that, you'll need `var someService = nsPreferences.getmPrefService();` to retrieve the value. Note `()` at the end, getters don't use that, but regular functions require it. – bfavaretto Aug 02 '13 at 13:18