Конфигурируемые свойства объекта.
Свойства объекта часто определяют как пары «ключ-значение». По большому счету это не совсем так. Кроме собственно имени и значения свойства также имеют так называемые атрибуты. В спецификации ECMAScript 3 атрибуты свойств не доступны для чтения и записи, однако, в ECMAScript 5 предусмотрены методы для работы с атрибутами свойств.
Атрибуты свойств
value — содержит непосредственно данные
writable — определяет, доступно ли данное свойство для записи (по умолчанию, true)
set — содержит setter, функцию, которая вызывается при записи свойства
get — содержит getter, функцию, которая вызывается при чтении свойства
enumerable — определяет доступность свойства для перечисления
configurable — определяет доступность свойства для изменения (например, может ли свойство быть удалено, может ли быть изменен какой-либо атрибут свойства)
Дескрипторы свойств
Дескриптор свойства объекта описывает атрибуты свойства в виде объекта, именами свойств этого объекта являются названия атрибутов, а значениями — значения атрибутов. Получить дескриптор свойства можно с помощью метода Object.getOwnPropertyDescriptor().
Получим дескрипторы свойств объекта circle:
var circle = { x: 0, y: 0, r: 15,};console.log(Object.getOwnPropertyDescriptor(circle, 'r'));/* Получим объект{ configurable: true, enumerable: true, value: 15, writable: true,}*/С дескрипторами свойств также работают следующие функции:
Object.defineProperty() — создает или изменяет свойство объекта, возвращает модифицированный объект:
const bob2 = {
age: 20,
};
Object.defineProperty(
bob2,
'name',
{
value: 'Bob',
}
);
Object.defineProperty(
bob2,
'age',
{
configurable: true,
value: 21,
}
);
Object.defineProperties() — метод аналогичен defineProperty, но позволяет оперировать сразу с несколькими свойствами. Также возвращает модифицированный объект.
Object.defineProperties(bob2, { name: { value: 'Jhon', }, age: { value: 36, enumerable: false, },});Object.create() — создание объекта. В качестве первого параметра принимает объект-прототип создаваемого объекта, в качестве второго необязательного параметра — список свойств объекта.
Перечислимые свойства объекта
Атрибут enumerable определяет, доступно ли свойство для перечисления, а именно, будет ли оно доступно в циклах for/in, все остальные операции игнорирую атрибут enumerable.
Иммутабельность объектов. Копирование объектов.
Что такое иммутабельность?
Неизменяемым (англ. immutable) называется объект, состояние которого не может быть изменено после создания. Результатом любой модификации такого объекта всегда будет новый объект, при этом старый объект не изменится.
var immutableArr = Immutable([1, 2, 3, 4]);var newImmutableArr = immutableArr.concat([5]);console.log(immutableArr); //[1, 2, 3, 4];console.log(newImmutableArr); //[1, 2, 3, 4, 5];Речь не идет о глубоком копировании: если объект имеет вложенную структуру, то все вложенные объекты, не подвергшиеся модификации, будут переиспользованы:
var state = Immutable({ style : { color : { r : 128, g : 64, b : 32, }, font : { family : 'sans-serif', size : 14, }, }, text : 'Example', bounds : { size : { width : 100, height : 200, }, position : { x : 300, y : 400, }, },});var nextState = state.setIn(['style', 'color', 'r'], 99);state.bounds === nextState.bounds; //truestate.text === nextState.text; //true
В памяти объекты будут представлены следующим образом:
Копирование по ссылке
Фундаментальным отличием объектов от примитивов, является их хранение и копирование «по ссылке». В переменной, которой присвоен объект, хранится не сам объект, а «адрес его места в памяти», иными словами – «ссылка» на него.
Вот как выглядит переменная, которой присвоен объект:
var user = {
name: "Вася"
};
Внимание: объект – вне переменной. В переменной – лишь «адрес» (ссылка) для него.