Pull to refresh

Comments 17

Добавьте, пожалуйста, в самое начало:
Данные знания(кроме дескриптов) на практике использовать нужно ОЧЕНЬ ОБДУМАННО и обязательно проконсультируйтесь с более опытными коллегами.
Конечно, это мое ИМХО.
Интересно, а влияют ли эти меотды защиты объектов на производительность?
Это нативные вещи — так что если эффект какой и есть — то минимальный
freeze потенциально может даже ускорять, т.к. объект становится константой.
Если я ничего не путаю, mraleph где-то рассказывал о кейсах, в которых getter'ы ускоряли выполнение кода, т. к. движок их успешно инлайнил (вместо выполнения property lookup'а). :D
Если <...> попытаться поменять значение свойства name объекта accessorObj, скажем, выполнив команду accessorObj.name = 'New Person’;, то окажется, что ничего не произойдёт.
Маленькая поправка: в strict mode будет TypeError. Аналогично и в остальных случаях.

Стоит упомянуть что, что Freeze не "замораживает" вложенные объекты.

Ага, а ещё он не оказывает эффекта на содержимое объектов Date, Map и Set. ¯\_(ツ)_/¯

let m = new Map([ ['a', 1] ]);
Object.freeze(m);
m.set('a', 2);  // freeze? не, не слышал
m.get('a');  // => 2
В принципе, это логично. Вот что мне выдала консоль браузера:
Map(0) {}
size: …
__proto__: Map
[[Entries]]: Array(0)
length: 0

Если предположить, что size — свойство с методами доступа, при добавлении ключа в Map не добавляются свойства, не удаляются свойства и не изменяются свойства объекта. Внутренняя структура объекта [[Entries]] — уже не зона ответственности freeze.

Интуитивно это или нет — другой вопрос. С моей точки зрения это лучший вариант из возможных, я бы даже сказал, единственный, который соответствует спецификации функции freeze.
Да, всё именно так.
На мой взгляд это слегка неожиданно (когда в первые с этим сталкиваешься) и неприятно, т. к. нет иммутабельности для довольно базовых типов (но да, у меня нет решения, которое бы хорошо вписывалось в остальной язык).

Для подобного всё-таки больше подходит Immutable.js

Ну в тех же C/С++ (или только в C++?) есть константные указатели, есть указатели на константные значения и есть константные указатели на константные значения. По- моему вполне логично, что заморозка объекта делает свойства объекта константными «указателями», но не делает константными объекты, на которые эти «указатели» ссылаются.
Про фокусы с Symbol еще хотелось бы узнать.
Ну, есть ещё есть функционал, предоставляемый т. н. well-known symbols, которые позволяют управлять некоторые аспектами внутреннего поведения языка.

Самый известный из них Symbol.iterator, как часть протокола итерирования, но есть и пачка других.

Можно, к примеру объявить класс, который будет считать своими инстансами всё, что угодно:
class Foo {
    static [Symbol.hasInstance]() { return true; }
} 

({}) instanceof Foo;  // true 
([]) instanceof Foo;  // true
(2) instanceof Foo;   // true


Из немного более практически полезного — Symbol.isConcatSpreadable позволяет управлять тем, как Array#concat разворачивает массивы:
[1, 2, 3].concat(4);  // [1, 2, 3, 4]
[1, 2, 3].concat([4])  // [1, 2, 3, 4]

let a = [4];
a[Symbol.isConcatSpreadable] = false;
[1, 2, 3].concat(a);  // [1, 2, 3, [4]] 

Sign up to leave a comment.