Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Javascript: constant properties

In javascript, can I declare properties of an object to be constant?

Here is an example object:

   var XU = {
      Cc: Components.classes
   };

or

   function aXU()
   {
      this.Cc = Components.classes;
   }

   var XU = new aXU();

just putting "const" in front of it, doesn't work.

I know, that i could declare a function with the same name (which would be also kind of constant), but I am looking for a simpler and more readable way.

Browser-compatibility is not important. It just has to work on the Mozilla platform, as it is for a Xulrunner project.

Thank you a lot!

Cheers.

like image 564
CodeSalad Avatar asked May 25 '09 12:05

CodeSalad


People also ask

What is const {} in JS?

The const declaration creates a read-only reference to a value. It does not mean the value it holds is immutable—just that the variable identifier cannot be reassigned. For instance, in the case where the content is an object, this means the object's contents (e.g., its properties) can be altered.

Can you change properties of const?

The property of a const object can be change but it cannot be change to reference to the new object. The values inside the const array can be change, it can add new items to const arrays but it cannot reference to a new array. Re-declaring of a const variable inside different block scope is allowed.

How do we declare object constants in JavaScript?

ES6 provides a new way of declaring a constant by using the const keyword. The const keyword creates a read-only reference to a value. By convention, the constant identifiers are in uppercase. Like the let keyword, the const keyword declares blocked-scope variables.

What are the properties of JavaScript?

A JavaScript property is a characteristic of an object, often describing attributes associated with a data structure. There are two kinds of properties: Instance properties hold data that are specific to a given object instance. Static properties hold data that are shared among all object instances.


2 Answers

Since you only need it to work on the Mozilla platform, you can define a getter with no corresponding setter. The best way to do it is different for each of your examples.

In an object literal, there is a special syntax for it:

var XU = {
    get Cc() { return Components.classes; }
};

In your second exampe, you can use the __defineGetter__ method to add it to either aXU.prototype or to this inside the constructor. Which way is better depends on whether the value is different for each instance of the object.

Edit: To help with the readability problem, you could write a function like defineConstant to hide the uglyness.

function defineConstant(obj, name, value) {
    obj.__defineGetter__(name, function() { return value; });
}

Also, if you want to throw an error if you try to assign to it, you can define a setter that just throws an Error object:

function defineConstant(obj, name, value) {
    obj.__defineGetter__(name, function() { return value; });
    obj.__defineSetter__(name, function() {
        throw new Error(name + " is a constant");
    });
}

If all the instances have the same value:

function aXU() {
}

defineConstant(aXU.prototype, "Cc", Components.classes);

or, if the value depends on the object:

function aXU() {
    // Cc_value could be different for each instance
    var Cc_value = return Components.classes;

    defineConstant(this, "Cc", Cc_value);
}

For more details, you can read the Mozilla Developer Center documentation.

like image 197
Matthew Crumley Avatar answered Oct 19 '22 09:10

Matthew Crumley


UPDATE: This works!

const FIXED_VALUE = 37;
FIXED_VALUE = 43;
alert(FIXED_VALUE);//alerts "37"

Technically I think the answer is no (Until const makes it into the wild). You can provide wrappers and such, but when it all boils down to it, you can redefine/reset the variable value at any time.

The closest I think you'll get is defining a "constant" on a "class".

// Create the class
function TheClass(){
}

// Create the class constant
TheClass.THE_CONSTANT = 42;

// Create a function for TheClass to alert the constant
TheClass.prototype.alertConstant = function(){
  // You can’t access it using this.THE_CONSTANT;
  alert(TheClass.THE_CONSTANT);
}

// Alert the class constant from outside
alert(TheClass.THE_CONSTANT);

// Alert the class constant from inside
var theObject = new TheClass();
theObject.alertConstant();

However, the "class" TheClass itself can be redefined later on

like image 44
scunliffe Avatar answered Oct 19 '22 09:10

scunliffe