2013-11-30 2 views
0

Я читал ECMAScript Standard, и наткнулся на следующий пассаж (раздел 8,6):Accessor Функции свойств объекта в Javascript:

A named accessor property associates a name with one or two accessor functions, and a set of Boolean attributes. The accessor functions are used to store or retrieve an ECMAScript language value that is associated with the property.

Предположим, я использую Javasript, который следует за Стандарт ECMAScript.

Стандарт говорит: связывает имя с одной или двумя функциями доступа.

Как я мог бы реализовать свойство объекта в JavaScript, который имеет только один этих функций доступа? I.e., геттер функция доступа?

Например, сохранение значения в объекте Object без возможности его изменения. Насколько мне удалось это обработать, свойства Object, похоже, автоматически включаются как с функциями доступа.

Есть Object.freeze() единственный способ достижения этого?

ответ

2

Вы можете просто использовать get сахар синтаксис:

var obj = { 
    get foo() { 
    return 1; 
    } 
} 

console.log(obj.foo) // 1 

Или вы можете использовать Object.defineProperty:

var obj = {}; 

Object.defineProperty(obj, 'foo', { 
    get : function() { return 1; } 
}); 

Как вы можете видеть из документации, связанной, вы также можете указать набор логических атрибутов (тот, который указан в вашем вопросе), например writable, enumerable и configurable; что вы не можете сделать только с первым синтаксисом, о котором я говорил.

Например, вы могли бы также иметь:

var obj = {}; 

Object.defineProperty(obj, 'foo', { 
    value: 1, 
    enumerable: true 
}); 

Чтобы получить то, что вы спрашиваете в конце вашего вопроса, и без использования поглотителя вообще. Обратите внимание, что таким образом вы также предотвращаете свойство foo, которое должно быть удалено delete (по умолчанию writable и configurable - false, поэтому таким образом вы просто уверены, что можно указать свойство foo). Для получения более подробной информации см. Документацию Object.defineProperty.

+0

'defineProperty' ... конечно! Вероятно, это лучший способ действительно управлять свойствами - я не могу поверить, что не нашел этого в своем первоначальном поиске. Я, должно быть, просто снял это случайно ... спасибо! –

Смежные вопросы