2015-06-17 3 views
3

Я читал this вопрос только для чтения свойств, и я пришел на этот фрагмент:Объект только для чтения свойства

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 

Теперь, я знаю, чтобы скрыть масштабы, вы можете использовать IIFE, также сделать переменную или свойство «частным», но я не понимаю:

Почему разрешено назначение, и если это разрешено, как ничего не может случиться? В этом фрагменте нет предполагаемой области видимости, поэтому я не понимаю, как что-то в JS может вывести частную собственность.

+0

Это не «частный», он использует ключевое слово «получить» для запуска функции, которая возвращает значение всякий раз, когда вы ссылаетесь на свойство. –

+0

Добавьте функцию 'set readOnlyProperty()', которая выдает ошибку для предотвращения назначения. – Barmar

+0

Не мог ли пользователь просто определить метод сеттера и переопределить этот аспект только для чтения? –

ответ

6

Why is assignment allowed, and if it's allowed, how can nothing happen? In this snippet there is no inferred scope, so I don't understand how something in JS can infer a private property.

Поскольку назначения (до строгого режима) никогда не бросают и не делают бросок, это нарушит тот инвариант, которого ожидают люди. Хотя вы все равно можете переопределить его (сделав сеттер и сделав , что throw) это поведение по умолчанию в JavaScript для свойств. Нам это не нравится, но это то, что есть.

Если вы используете строгий режим - вы должны получить:

TypeError: setting a property that has only a getter

2

Геттеры и сеттеры в пределах объекта буквенных выражений чистый сахар по Object.defineProperty() используется в ES5.

Что делает геттер, так это то, что он возвращает определенное значение, когда запрашивается свойство определенного объекта.

let obj = {}; 
obj.foo = 3; // I am SETTING a property value 
obj.foo; // I am GETTING the property value 

Таким образом, когда вы определяете getter, каждый раз, когда вы запрашиваете собственность, вы получаете значение, что getter возвращается.

Так что если у вас есть

let obj = {}; 

Object.defineProperty(obj, 'readOnly', { 
    'get': function() { return 42; } 
}); 

Или

let obj = { 
    get readOnly() { return 42; } 
}; 

Ваша переменная всегда будет 42, потому что он может возвращать только это значение. Вы можете попытаться установить это свойство на любое значение, но в конце концов, он всегда будет возвращаться 42.

запрещенного задания, вы можете добавить сеттер и сделать его throw Error

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