Object.defineProperty является то, что вы хотите.
Для примера:
var obj = {};
Object.defineProperty(obj, 'key', {
enumerable: false,
configurable: false,
writable: false,
value: 'static'
});
Виль определить "obj.key" со значением: "статическим" и это будет только для чтения.
- Перечислимое означает, что оно будет отображаться (или нет) при перечислении свойств объекта.
- Writable означает, что если вы хотите, чтобы он был только для чтения, вы бы сказали false. не доступен для записи.
- Настраивается на false, если вы не хотите, чтобы его можно было удалить из объекта.
По существу, ставя их всех в ложные, вы создаете константы на объекте. Btw, их значения по умолчанию должны быть ложными.
Так эффективно это сделать:
Object.defineProperty(obj, 'property', { value: 'value'});
Создаст константу на «Obj» под названием «собственности» с «значение» значение. Или вы могли бы это сделать
function setConstant(obj, key, value)
{
Object.defineProperty(obj, key, {value: value });
}
var obj = {};
setConstant(obj, "constantName", "constantValue");
Сделал бы это очень читаемым.
Да, единственный совместимый с кросс-браузером способ определения своего рода констант - использовать закрытие и предоставлять методы для доступа к этой переменной (как если бы у нее была приватная переменная ...). Но моя проблема заключалась в том, чтобы предоставить разработчику возможность получать значение из константы как obj.MY_CONSTANT, чтобы ваше последнее решение не соответствовало. Итак, в конце, для этого (IE также 8 вер.) Ужасных и несовместимых браузеров мы, разработчик, всегда должны находить плохое решение и тратить наше время. Когда M $ поймет, что веб-разработчик хочет СТАНДАРТЫ ????? – xdevel2000
Обычно я не возражаю, если кто-то хочет жаловаться на M $ и стандарты, но в этом случае это кажется несправедливым, потому что константы javascript не являются частью какой-либо спецификации, они специфичны для Mozilla. – Prestaul
Да, но я был связан с «стандартным де-факто» и const, __defineGetter__ и т. Д. Поддерживаются, например. двигателями webKit (Chrome и т. д.). Объект XMLHttpRequest не является стандартом w3C (он был изобретен M $), но он был принят всеми. – xdevel2000