Подтвердить что ты не робот

Javascript: постоянные свойства

В javascript я могу объявить свойства объекта постоянными?

Вот пример объекта:

   var XU = {
      Cc: Components.classes
   };

или

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

   var XU = new aXU();

просто поставить "const" перед ним, не работает.

Я знаю, что я могу объявить функцию с тем же именем (что также было бы константой), но я ищу более простой и понятный способ.

Совместимость браузера не важна. Он просто должен работать на платформе Mozilla, как и для проекта Xulrunner.

Большое вам спасибо!

Приветствия.

4b9b3361

Ответ 1

Поскольку вам нужно только работать на платформе Mozilla, вы можете определить геттер без соответствующего установщика. Лучший способ сделать это по-разному для каждого из ваших примеров.

В литературе объекта для него есть специальный синтаксис:

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

В вашем втором примере вы можете использовать метод __defineGetter__, чтобы добавить его в aXU.prototype или this внутри конструктора. Какой способ лучше зависит от того, отличается ли значение для каждого экземпляра объекта.

Изменить: Чтобы помочь с проблемой чтения, вы можете написать функцию типа defineConstant, чтобы скрыть уродство.

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

Кроме того, если вы хотите выбросить ошибку, если вы попытаетесь присвоить ей, вы можете определить сеттер, который просто бросает объект Error:

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

Если все экземпляры имеют одинаковое значение:

function aXU() {
}

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

или, если значение зависит от объекта:

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

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

Для получения дополнительной информации вы можете прочитать Документацию разработчика Mozilla.

Ответ 2

ОБНОВЛЕНИЕ: это работает!

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

Технически я думаю, что ответ отрицательный (до const делает это в дикой природе). Вы можете предоставить обертки и т.д., Но когда все это сводится к этому, вы можете переопределить /reset значение переменной в любое время.

Ближайшим, я думаю, вы получите определение "константа" в "классе".

// 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();

Однако сам класс TheClass может быть переопределен позже

Ответ 3

Если вы используете Javascript 1.5 (например, в XUL), вы можете использовать ключевое слово const вместо var для объявления константы.

Проблема заключается в том, что он не может быть свойством объекта. Вы можете попытаться ограничить область действия, указав ее внутри функции.

(function(){ 

const XUL_CC = Components.classes;

// Use the constant here

})()

Ответ 4

Чтобы определить свойство константы, вы можете установить для атрибута writeable значение false в методе defineProperty, как показано ниже:

Фрагмент кода:

var XU = {};

Object.defineProperty(XU, 'Cc', {
    value: 5,
    writable: false
});

XU.Cc = 345;

console.log(XU.Cc);

Результат:

5           # The value hasn't changed