2015-08-05 4 views
0

const может быть использован для объявления констант:Почему постоянные поля не защищены?

> const a = 42 
undefined 
> a = 7 
7 
> a 
42 

Это круто, но я заметил, что при использовании const объявить объекты такое поведение больше не работает:

> const b = { foo: { bar: 42 }, baz: 7 } 
undefined 
> b.baz = { hello: "world" } 
{ hello: 'world' } 
> b.foo.bar = 7 
7 
> b 
{ foo: { bar: 7 }, baz: { hello: 'world' } } 

Как вы можете видеть , Я изменил поле baz на объект, и я изменил 42 на 7.

ЧИТАЕТ docs Я вижу это, как ожидается:

// Overwriting the object fails as above (in Firefox and Chrome 
but not in Safari) 
MY_OBJECT = {"OTHER_KEY": "value"}; 

// However, object attributes are not protected, 
// so the following statement is executed without problems 
MY_OBJECT.key = "otherValue"; 

Однако, почему это работает, как это? Какова логика?

С другой стороны, вопрос заключается в следующем: как объявлять постоянные объекты?

+0

сопзЬ только предотвращает переопределение вар, что вы, кажется, хотите непреложный объект, простые JS-объекты не являются - возможно, это (https://github.com/facebook/immutable-js) – birdspider

+0

* const просто предотвращает повторную декларацию var * - но если I * переопределяет * константу, значение не изменяется. Только путем изменения подполя значение изменяется. –

+0

@ IonicăBizău Нет, «значение» объекта является адресом его памяти. – Siguza

ответ

2

Однако, почему это работает так? Какова логика?

const только объявляет привязку постоянной. Он не автоматически делает каждое значение, которое оно инициализируется неизменным.

Как объявить постоянные объекты?

Чтобы предотвратить объект из того мутировал, вы можете Object.freeze его:

"use strict"; 
const b = Object.freeze({foo: Object.freeze({bar: 42}), baz: 7}); 
b.baz = {hello: "world"}; // Error: Invalid assignment in strict mode 
Смежные вопросы