Редактировать: С тех пор, как этот ответ был написан, новый, лучший способ использования Object.defineProperty
был стандартизирован в EcmaScript 5 с поддержкой в новых браузерах. См. Ответ Айдамины . Если вам требуется поддержка «старых» браузеров, вы можете использовать один из методов в этом ответе как запасной вариант.
В Firefox, Opera 9.5+ и Safari 3+, Chrome и IE (протестировано с v11) вы можете определять свойства getter и setter. Если вы определяете только метод получения, он фактически создает свойство только для чтения. Вы можете определить их в литерале объекта или вызвав метод объекта.
var myObject = {
get readOnlyProperty() { return 42; }
};
alert(myObject.readOnlyProperty); // 42
myObject.readOnlyProperty = 5; // Assignment is allowed, but doesn't do anything
alert(myObject.readOnlyProperty); // 42
Если у вас уже есть объект, вы можете вызвать __defineGetter__
и __defineSetter__
:
var myObject = {};
myObject.__defineGetter__("readOnlyProperty", function() { return 42; });
Конечно, это не очень полезно в Интернете, потому что оно не работает в Internet Explorer.
Подробнее об этом можно прочитать в блоге Джона Ресига или Mozilla Developer Center .