Javascript: постоянные свойства - PullRequest
12 голосов
/ 25 мая 2009

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

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

   var XU = {
      Cc: Components.classes
   };

или

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

   var XU = new aXU();

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

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

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

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

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

Ответы [ 4 ]

12 голосов
/ 25 мая 2009

Поскольку он нужен только для работы на платформе 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 Developer Center .

5 голосов
/ 25 мая 2009

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

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

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

Самое близкое, я думаю, вы получите определение "константы" для "класса".

// 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 может быть переопределен позже

2 голосов
/ 25 мая 2009

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

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

(function(){ 

const XUL_CC = Components.classes;

// Use the constant here

})()
0 голосов
/ 25 июня 2017

Чтобы определить постоянное свойство, вы можете установить атрибут 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
...