Javascript: постоянные свойства
В javascript я могу объявить свойства объекта постоянными?
Вот пример объекта:
var XU = {
Cc: Components.classes
};
или
function aXU()
{
this.Cc = Components.classes;
}
var XU = new aXU();
просто поставить "const" перед ним, не работает.
Я знаю, что я могу объявить функцию с тем же именем (что также было бы константой), но я ищу более простой и понятный способ.
Совместимость браузера не важна. Он просто должен работать на платформе Mozilla, как и для проекта Xulrunner.
Большое вам спасибо!
Приветствия.
Ответы
Ответ 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