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

Определение свойств только для чтения в JavaScript

Учитывая объект obj, я хотел бы определить свойство только для чтения 'prop' и установить его значение val. Это правильный способ сделать это?

Object.defineProperty( obj, 'prop', {
    get: function () {
        return val;
    }
});

Результат должен быть (для val = 'test'):

obj.prop; // 'test'
obj.prop = 'changed';
obj.prop; // still 'test' since it read-only

Этот метод работает btw: http://jsfiddle.net/GHMjN/
Я просто не уверен, что это самый простой/самый плавный/самый правильный способ сделать это...

4b9b3361

Ответ 1

Вместо этого вы можете использовать свойство writable дескриптора свойства, что предотвращает необходимость в аксессуре get:

var obj = {};
Object.defineProperty(obj, "prop", {
    value: "test",
    writable: false
});

Это ECMAScript 5, поэтому он не будет работать в старых браузерах.

Ответ 2

Из-за старых браузеров (обратная совместимость) мне приходилось придумывать функции доступа для свойств. Я сделал его частью bob.js:

var obj = { };
//declare read-only property.
bob.prop.namedProp(obj, 'name', 'Bob', true);
//declare read-write property.
bob.prop.namedProp(obj, 'age', 1);

//get values of properties.
console.log(bob.string.formatString('{0} is {1} years old.', obj.get_name(), obj.get_age()));
//set value of read-write property.
obj.set_age(2);
console.log(bob.string.formatString('Now {0} is {1} years old.', obj.get_name(), obj.get_age()));

//cannot set read-only property of obj. Next line would throw an error.
// obj.set_name('Rob');

//Output:
//========
// Bob is 1 years old.
// Now Bob is 2 years old.

Надеюсь, это поможет.