Какими свойствами может обладать объект

Какими свойствами может обладать объект thumbnail

        2. Объекты: свойства и методы.

Объекты (Objects). Как конструирование графического интерфейса, так и
разработка программного кода базируется на использовании программных объектов.
Каждый объект обладает определенным набором свойств и может использо­вать определенные
методы обработки данных. Если гово­рить образно, то объекты — это существительные,
свойства объекта — это прилагательные, а методы объекта — это гла­голы.

Программные объекты обладают свойствами и могут использовать методы обработки данных.

Классы объектов являются «шаблонами», определяю­щими наборы свойств,
методов и событий, по которым со­здаются объекты. Основными классами объектов
являют­ся объекты, реализующие графический интерфейс проектов.

Объект, созданный по «шаблону» класса объектов, явля­ется экземпляром класса и наследует весь
набор свойств, методов и событий данного класса. Каждый экземпляр клас­са
объектов имеет уникальное для данного класса имя.

 

Основой для создания графи­ческого интерфейса проекта явля­ется объект «форма» (рис.).

Какими свойствами может обладать объектНа основании класса объек­тов Form можно создавать эк­земпляры
объектов «форма», ко­торые получают имена Form1, Form2 и т. д.    

Свойства объекта (Properties). Каждый класс объектов обладает определенным набором свойств. Так,
например, класс объектов Form обладает
несколькими десятками раз­личных свойств, которые определяют размеры объекта
«форма», цвет формы, положение на экране монитора и т. д. (табл.).

 

Таблица. Некоторые свойства
объекта «форма»

Свойство

Значение
по умолчанию

Комментарий

Name

Form1

Имя
объекта, используется в программ­ном коде для обращения к объекту

Text

Form1

Текст
в левом верхнем углу формы

BackColor

Control

Серый
цвет фона формы

Font

MS Sans Serif, обычный, 8

Шрифт,
его начертание и размер

Различные экземпляры
класса объектов обладают одина­ковым набором свойств, однако значения свойств у
них могут отличаться. Первоначальные значения свойств объектов можно установить
с использованием диалогового окна Свой­ства
(Properties) системы программирования.

Какими свойствами может обладать объект

Так, для объекта
«форма» Form1 можно установить тре­буемое
значение любого свойства. Для этого необходимо вы­брать свойство из списка и
изменить его значение.

Значения свойств
объектов можно изменять в программ­ном коде. Для присваивания свойству объекта
нового значе­ния в левой части строки программного кода необходимо указать имя
объекта и затем — название свойства, которые в соответствии с правилами
точечной нотации разделяются между собой точкой. В правой части строки необходимо
за­писать конкретное значение свойства:

Объект.Свойство
= ЗначениеСвойства

Например, новая
надпись «Первый проект» в левом верх­нем углу объекта Form1 (значение свойства Text) появится в результате выполнения программного кода:

Form1.Text = «Первый  
проект»

Методы объекта (Methods). Объекты могут использовать различные методы обработки
данных. Методы имеют аргу­менты, которые позволяют задать значения параметров
вы­полняемых действий.

Для использования
метода в строке программного кода необходимо указать имя объекта и затем метод,
которые в соответствии с правилами точечной нотации разделяются между собой
точкой. В скобках при необходимости записы­ваются аргументы метода, разделяемые
запятыми:

Объект.Метод (apr1,
арг2)

Например, с помощью
метода Scale (х, у) можно изме­нить
размеры формы или элемента управления. Аргументы метода x и y являются коэффициентами масштабирования по
горизонтали и вертикали, т. е. позволяют увеличить или уменьшить ширину и
высоту элемента управления. Напри­мер, можно в два раза увеличить размер объекта
по оси X и в
два раза его уменьшить по оси Y:

Me.Scale(2,0.5)

Если производятся операции над самой формой,
то  вместо ее имени (например, Form1) в программном коде используется имя  Me.

Источник

Наиболее важная часть объекта – его свойства. Объект представляет из себя набор свойств, и каждое свойство состоит из имени и значения, ассоциированного с этим именем. Именем свойства (ключом) может быть только строка, а вот значением – любой тип данных. Если значением свойства является функция, то её можно назвать методом объекта.

Свойства объектов в JavaScript являются теми же самыми переменными, за тем исключением, что они закреплены за объектом. Как и все переменные JavaScript, имя объекта (которое тоже может быть переменной) и имя свойства чуствительны к регистру. Свойства объекта определяют его индивидуальные характеристики.

Получить значение свойства можно с помощью операторов точки (.) или квадратных скобок ([]). Значение в левой части оператора должно быть ссылкой на объект, обычно это просто имя переменной, содержащей ссылку на объект, но это может быть любое допустимое в JavaScript выражение, являющееся объектом.

Значение в правой части оператора должно быть именем свойства. При использовании оператора точка (.) справа должен находиться простой идентификатор, соответствующий имени свойства. Доступ к любому имени свойства, которое содержит невалидный JavaScript идентификатор (например, имя свойства содержит в себе пробел, тире или начинается с цифры), может быть получен с использованием квадратных скобок ([]).

Значение свойства может быть любым: как значением простого типа, так и другим объектом. Значения можно вкладывать друг в друга, причем вложений можно делать сколько угодно:

Значение объекта может быть обновлено путем присваивания. Если свойство с таким именем уже существует в объекте, его значение заменяется:

Квадратные скобки также позволяют обратиться к свойству, имя которого хранится в переменной:

Если имя свойства хранится в переменной, то единственный способ к нему обратиться – это применение оператора [] (квадратные скобки).

Метод – это свойство объекта, значением которого является функция. Методы определяются так же, как и обычные функции, за тем исключением, что они присваиваются свойству объекта. Вызов метода осуществляется точно также, как и вызов обычной функции – с помощью оператора вызова ():

Методы объектов можно добавлять и удалять в любой момент, точно также как вы поступаете с обычными свойствами объектов:

Для доступа к свойствам объекта внутри метода используется ключевое слово this. Использование this позволяет ссылаться на объект, к которому принадлежит метод:

Здесь вместо this внутри функции (метода) greeting можно было бы обратиться к объекту, используя переменную person (сам объект):

Ключевое слово this

var person = {
name: ‘John’,
greeting: function() {
alert( ‘Hello, ‘ + this.name + ‘!’);
}
// идентичная запись
greeting: function() {
alert( ‘Hello, ‘ + person.name + ‘!’);
}

В предыдущем примере мы определили функцию внутри свойства greeting во время определения объекта person. Однако, мы можем определить сначала функцию, а затем закрепить ее за свойством person.fun. В таком случае поведение this не изменится:

Эти примеры показывают, что на поведение this совсем не влияет то, где была определена функция, а имеет значение только то, что функция была вызвана из свойства объекта.

Читайте также:  Какими свойствами обладают углы четырехугольника вписанного в окружность

Через ключевое слово this метод может получить доступ не только к любому свойству объекта, но и передать куда-нибудь ссылку на сам объект:

Известно, что каждый объект содержит ссылку на свой объект-прототип. Если метод находится где-то в цепочке прототипов, то this ссылается на объект, на котором был вызван метод, т.е. как будто этот метод является методом самого объекта, а не прототипа.

В этом примере объект person, не имеет собственного свойства (метода) fullName, а наследует это свойство от своего прототипа prototypeObject. Поскольку поиск свойства начался с person.fullName, то this внутри функции fullName будет ссылаться на объект person. Таким образом, если fullName вызывается как метод объекта person, то и this относится к person. Это очень важная особеность прототипного наследования JavaScript.

Оператор delete удаляет свойство из объек­та. Он удаляет свойство объекта, если оно есть. Удаление не касается свойств объектов, связанных по цепочке прототипов. Если свойство с таким же именем существует в цепочке прототипов, объект унаследует это свойство из прототипа.

Выражение delete возвращает true, если удаление свойства прошло успешно. delete вернет false только в том случае, когда свойство не было удалено (например, если свойство относится к защищенному объекту, принадлежащему браузеру). true возвращается даже в том случае, если свойство, которое вы пытаетесь удалить, не существует в объекте:

  • Объект представляет собой набор свойств.
  • Получить значение свойства можно с помощью операторов точки (.) или квадратных скобок ([]).
  • Свойства можно добавить в объект в любой момент. Для этого следует присвоить значение с указанием имени нового свойства.
  • Метод представляет собой свойство, значением которого является функция. Для ссылки на объект, из которого вызывается метод, используется ключевое слово this.
  • Методы можно вызывать в точечной записи: имя объекта, точка и имя свойства метода, за которым следует пара круглых скобок.
  • Метод можно рассматривать как функцию, присвоенную свойству, поэтому новый метод можно добавить в любой момент.
  • Методы могут получать аргументы, как и обычные функции.
  • Если несуществующему свойству объекта присваивается значение, данное свойство добавляется в объект. Для удаления свойств используют инструкцию delete.
  • Свойства объекта

    Почему данный код выдаёт синтаксическую ошибку?

    var cat = {
    legs: 4
    name: «Гармония»
    color: «Черепаховый»
    };

    alert( cat.name ); // SyntaxError

    Показать решение

    Решение:

    Чтобы исправить ошибку, нужно добавить запятую после первого и второго свойства.

    • Доступ к свойствам объекта

      Сохраните значения свойств объекта myObj в переменных x, y и z. Выведите значения переменных x, y и z через alert.

      var myObj = {
      «an entree»: «hamburger»,
      «my side»: «veggies»,
      «the drink»: «water»
      };

      // ваш код

      Показать решение

      • Свойство в переменной

        1. В переменной myDog сохраните имя свойства объекта dogs: «hunter».
        2. Присвойте свойство с именем myDog и значением «Ротвейлер» объекту dogs.
        3. Выведите значение свойства, хранящегося в переменной myDog через alert.
        var dogs = {
        running: «Арабская борзая»,
        hunter: «Лабрадор»,
        guard: «Московская»
        }

        // ваш код

        Показать решение

        Решение:

        Если имя свойства объекта хранится в переменной (var myDog = «hunter»), то обратиться к нему можно только через квадратные скобки dogs[myDog].

        • Обновить свойство

          Поменяйте значение свойства guard c «Московская» на «Московская-сторожевая»

          var dogs = {
          running: «Арабская борзая»,
          hunter: «Лабрадор»,
          guard: «Московская»
          }

          // ваш код

          Показать решение

          Решение:

          Если имя свойства объекта хранится в переменной (var myDog = «hunter»), то обратиться к нему можно только через квадратные скобки dogs[myDog].

          • Добавление и удаление свойств

            Добавьте в объект dogs свойство с именем driving и значением «Сибирский хаски». Удалите свойство «guard» из dogs. Выведите вновь добавленное и удалённое свойства через alert.

            var dogs = {
            running: «Арабская борзая»,
            hunter: «Лабрадор»,
            guard: «Московская-сторожевая»
            }

            // ваш код

            Показать решение

            • Добавление метода

              1. Определите никак не связанную с приведенными объектами dog_1 и dog_2 функцию testBreed, которая будет выводить породу (breed), тип (a type) и вес (the weight) собаки.
              2. Присвойте функцию testBreed свойству sayAbout для обоих объектов.
              3. Запустите функцию testBreed для каждого из объектов.
              var dog_1 = {
              breed: «Алабай»,
              «a type»: «собака-компаньон»,
              «the weight»: «50 кг»
              }

              var dog_2 = {
              breed: «Бультерьер»,
              «a type»: «бойцовская»,
              «the weight»: «36 кг»
              }

              // ваш код

              Показать решение

Источник

Автор материала, перевод которого мы сегодня публикуем, говорит, что в JavaScript-объектах содержится много такого, о существовании чего можно и не подозревать, пользуясь ими в повседневной работе. Объекты в JavaScript очень легко создавать, с ними удобно работать, они кажутся понятными и гибкими сущностями, и многие программисты попросту не задумываются о том, что на самом деле устроены объекты не так уж и просто.

NB: Информацию из публикации на практике следует применять крайне аккуратно и под присмотром более опытных коллег.

Здесь мы поговорим о том, что скрыто в глубинах объектов и обсудим тонкости работы с ними.
Освоив этот материал, вы будете знать ответы на следующие вопросы:

  • Как сделать свойство объекта неудаляемым?
  • Что представляют собой свойства с методами доступа и каковы их особенности?
  • Как сделать свойство иммутабельным или скрытым?
  • Почему некоторые свойства не видны в циклах for-in или в результатах работы метода Object.keys(), а некоторые — видны?
  • Как «защитить» объект от модификации?
  • Как понять фрагмент кода, подобный следующему:

obj.id = 5;
console.log(obj.id)
// => ‘101’ (5 в двоичной системе счисления)

Виды свойств объектов

▍Свойства, хранящие данные

Вероятно, вам доводилось создавать бесчисленное множество объектов, напоминающих этот:

const obj = {
 name: ‘Arfat’,
 id: 5
}
obj.name
// => ‘Arfat’

Свойства name и id объекта obj называются свойствами, хранящими данные, или «свойствами с данными» (Data Properties). Это — привычные свойства, которые постоянно встречаются в JavaScript-коде. Какими ещё видами свойств могут обладать объекты?

▍Свойства с методами доступа

Такие свойства ещё известны как геттеры и сеттеры, они встречаются и в других языках программирования наподобие C# или Python. Свойство с методами доступа (Accessor Property) представляет собой комбинацию из двух функций — get и set.

При объявлении таких свойств вместо использования традиционной конструкции вида ключ: значение применяется следующий синтаксис:

const accessorObj = {
 get name() {
   return ‘Arfat’;
 }
};
accessorObj.name;
// => ‘Arfat’
const dataObj = {
 name: ‘Arfat’,
};
dataObj.name;
// => ‘Arfat’

Читайте также:  Каким свойством обладают конденсаторы

Взгляните на объект accesorObj и сравните его с объектом dataObj. Как видно, сейчас они демонстрируют одинаковое поведение. При описании первого объекта мы воспользовались ключевым словом get, за которым следует объявление функции. Для того чтобы получить доступ к подобному свойству, хотя оно и представлено функцией, не нужно ставить после имени свойства круглые скобки для вызова этой функции. То есть конструкция наподобие accessorObj.name(); некорректна.

При попытке доступа к свойству accessorObj.name, то есть, при попытке его чтения, выполняется соответствующая функция и возвращаемое ей значение становится значением свойства name.

Функции get называют геттерами, они отвечают за получение значений. Если продолжить наш пример и попытаться поменять значение свойства name объекта accessorObj, скажем, выполнив команду accessorObj.name = ‘New Person’;, то окажется, что ничего не произойдёт. Дело тут в том, что с ключом name не связана функция-сеттер. Такие функции позволяют настраивать порядок назначения новых значений свойствам объектов, доступ к которым организован с помощью геттеров.

Вот как выглядит объявление объекта с геттером и сеттером:

const accessorObj = {
 _name: ‘Arfat’,
 get name() {
   return this._name;
 },
 set name(value) {
   this._name = value;
 }
};

Функция-сеттер получает то, что пытаются присвоить свойству объекта, в качестве параметра. Теперь в свойстве объекта можно что-нибудь сохранить. В данном случае мы создаём «приватное» свойство объекта _name. Первым символом имени такого свойства является знак подчёркивания, который является не более чем подсказкой для программиста, указывающей на то, что это свойство предназначено для внутренних нужд объекта. Далее, мы работаем с ним при обращении к свойству объекта name, доступ к которому регулируется геттером и сеттером.

При этом в функции-геттере, перед возвратом значения свойства _name, мы можем его модифицировать.

Вот как это может выглядеть:

const obj = {
 get name() {
   return this._name.toUpperCase();
 },
 set name(value) {
   this._name = value;
 },
 get id() {
   return this._id.toString(2); // Преобразуем десятичное число в его двоичное представление
 },
 set id(value) {
   this._id = value;
 }
}

obj.name = ‘Arfat’;
obj.name;
// => ‘ARFAT’

obj.id = 5;
obj.id;
// => ‘101

Эта программа, кстати, содержит ответ на один из вопросов, приведённых в начале статьи, который касается разбора непонятного на первый взгляд кода.

Зачем кому-то могут понадобиться свойства с методами доступа, если можно спокойно работать с обычными свойствами? Например, они могут понадобиться для того, чтобы записывать в журнал сведения об операциях чтения свойств, или для того, чтобы хранить историю изменений значений свойств. Свойства с методами доступа дают нам все возможности обработки данных с помощью функций и простоту, характерную для работы с обычными свойствами. Подробнее об использовании таких свойств можно почитать здесь.

Как JavaScript отличает обычные свойства, хранящие данные, от свойств с методами доступа? Выясним это.

Дескрипторы свойств объектов

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

▍Атрибуты свойств

С каждым ключом объекта связан набор атрибутов, которые определяют характеристики значения, связанного с данным ключом. Эти атрибуты можно ещё рассматривать как метаданные, описывающие пару ключ: значение.

Атрибуты используются для задания и описания состояния свойств объектов. Набор атрибутов свойства называется дескриптором. Существует шесть атрибутов свойств:

  • [[Value]]
  • [[Get]]
  • [[Set]]
  • [[Writable]]
  • [[Enumerable]]
  • [[Configurable]]

Почему названия атрибутов свойств в этом списке заключены в конструкцию [[]]? Двойные скобки указывают на то, что это — сущности, используемые внутренними механизмами языка. JS-программист не может обращаться к этим свойствам напрямую. Для того чтобы повлиять на них, используются соответствующие методы.

Рассмотрим следующее изображение, взятое отсюда, на котором можно видеть объект и атрибуты его свойств.

Объект и атрибуты его свойств

У нашего объекта есть 2 ключа — x и y. При этом с каждым из них связан набор атрибутов.

Как, средствами JavaScript, получить сведения об объекте, подобные тем, которые показаны на предыдущем рисунке? Для этого можно использовать функцию Object.getOwnPropertyDescriptor(). Она принимает объект и имя его свойства, после чего возвращает объект, содержащий атрибуты этого свойства. Вот пример:

const object = {
 x: 5,
 y: 6
};
Object.getOwnPropertyDescriptor(object, ‘x’);
/*
{
 value: 5,
 writable: true,
 enumerable: true,
 configurable: true
}
*/

Надо отметить, что состав атрибутов конкретного свойства зависит от его вида. Все шесть атрибутов у одного и того же свойства не встречаются.

  • Если речь идёт о свойствах с данными, то у них будут только атрибуты [[Value]], [[Writable]], [[Enumerable]] и [[Configurable]].
  • Свойства с методами доступа, вместо атрибутов [[Value]] и [[Writable]], имеют атрибуты [[Get]] и [[Set]].

▍[[Value]]

Этот атрибут хранит то, что выдаётся при попытке получения значения свойства объекта. То есть, если в предыдущем примере мы воспользуемся конструкцией вида object.x, мы получим то, что хранится в атрибуте [[Value]]. То же самое произойдёт и при попытке чтения свойства объекта с использованием квадратных скобок.

▍[[Get]]

Данный атрибут хранит ссылку на функцию, которая представляет собой свойство-геттер. Эта функция вызывается без аргументов при попытке чтения значения свойства.

▍[[Set]]

Здесь хранится ссылка на функцию, объявляемую при создании свойства-сеттера. Она вызывается с аргументом, представляющим собой то значение, которое попытались присвоить свойству, то есть, вызывается при каждой операции назначения свойству нового значения.

const obj = {
 set x(val) {
   console.log(val)
   // => 23
 }
}
obj.x = 23;

В этом примере правая часть выражения передаётся в виде аргумента val функции-сеттеру. Вот код, в котором демонстрируется использование сеттеров и геттеров.

▍[[Writable]]

Этот атрибут хранит логическое значение. Оно указывает на то, можно ли перезаписывать значение свойства или нет. Если здесь хранится значение false, то попытки изменить значение свойства успехом не увенчаются.

▍[[Enumerable]]

Здесь тоже хранится логическое значение. Этот атрибут регулирует выдачу свойства в циклах for-in. Если он установлен в значение true, то со свойством можно будет работать с помощью таких циклов.

▍[[Configurable]]

Этот атрибут тоже представлен логическим значением. Вот что происходит в том случае, если в нём хранится значение false:

  • Свойство нельзя будет удалить.
  • Нельзя будет преобразовывать свойства, хранящие данные, в свойства с методами доступа, и наоборот. Попытки выполнения подобных преобразований ни к чему не приведут.
  • Будет запрещено изменять значения атрибутов свойства. То есть неизменяемыми окажутся текущие значения атрибутов [[Enumerable]], [[Configurable]], [[Get]] и [[Set]].
Читайте также:  Какие свойства воздуха используют животные когда прячутся

Эффект, оказываемый установкой этого атрибута в значение false, кроме того, зависит от вида свойства. Этот атрибут, помимо вышеописанного воздействия на свойства, действует на них и так:

  • Если перед нами — свойство, которое хранит данные, то атрибут [[Writable]] можно лишь изменить с true на false.
  • До тех пор, пока атрибут [[Writable]] не установлен false, можно менять атрибут [[Value]]. Но после того как в false будут установлены атрибуты [[Writable]] и [[Configurable]], свойство окажется незаписываемым, неудаляемым и неизменяемым.

Работа с дескрипторами

Теперь, когда мы познакомились с атрибутами, зададимся вопросом о том, как нам можно на них влиять. В JavaScript существуют специальные функции, предназначенные для работы с дескрипторами свойств. Поговорим о них.

▍Метод Object.getOwnPropertyDescriptor()

Мы уже встречались с этим методом. Он, принимая объект и имя его свойства, возвращает либо undefined, либо объект с дескриптором свойства.

▍Метод Object.defineProperty()

Это — статический метод Object, который позволяет добавлять свойства к объектам или менять существующие свойства. Он принимает три аргумента — объект, имя свойства и объект с дескриптором. Этот метод возвращает модифицированный объект. Рассмотрим пример:

const obj = {};

// #1
Object.defineProperty(obj, ‘id’, {
 value: 42
});

// #2
console.log(obj);
// => { }

// #3
console.log(obj.id);
// => 42

// #4
Object.defineProperty(obj, ‘name’, {
 value: ‘Arfat’,
 writable: false,
 enumerable: true,
 configurable: true
});

// #5
console.log(obj.name);
// => ‘Arfat’

// #6
obj.name = ‘Arfat Salman’

// #7
console.log(obj.name);
// => ‘Arfat’
// (а не ‘Arfat Salman’)

Object.defineProperty(obj, ‘lastName’, {
 value: ‘Salman’,
 enumerable: false,
});

console.log(Object.keys(obj));
// => [ ‘name’ ]

// #8
delete obj.id;

// #9
console.log(obj.id);
// => 42

//#10
Object.defineProperties(obj, {
 property1: {
   value: 42,
   writable: true
 },
 property2: {}
});

console.log(obj.property1)
// => 42

Его можно запустить в среде Node.js. Код получился довольно большим, но, на самом деле, он довольно прост. Разберём его, ориентируясь на комментарии вида // #n.

Во фрагменте #1 мы пользуемся функцией defineProperty, передавая ей объект obj, имя свойства id и объект-дескриптор, содержащий лишь свойство value, указывающее на то, что в атрибут [[Value]] будет записано значение 42. Помните о том, что если не передать в этом объекте значения для атрибутов наподобие [[Enumerable]] или [[Configurable]], то они, по умолчанию, будут установлены в значение false. В данном случае атрибуты [[Writable]], [[Enumerable]] и [[Configurable]] свойства id установлены в false.

В месте, отмеченном как #2, мы пытаемся вывести строковое представление объекта в консоль. Так как его свойство id является неперечисляемым, выведено оно не будет. При этом свойство существует, что доказывает его успешный вывод командой #3.

Создавая объект (фрагмент #4), мы задаём полный список атрибутов. В частности, устанавливаем [[Writable]] в значение false.

Командами #5 и #7 мы выводим значение свойства name. Но между ними (фрагмент #6) мы попытались изменить это значение. Эта операция не привела к изменению значения свойства, так как его атрибут [[Writable]] установлен в false. В результате обе команды выводят в консоль одно и то же.

Команда #8 представляет собой попытку удаления свойства id. Вспомним о том, что его атрибут [[Configurable]] установлен в значение false, а это значит, что удалить его нельзя. Это доказывает команда #9.

Во фрагменте #10 показано использование функции Object.defineProperties(). Она работает так же, как и функция defineProperty(), но позволяет, за один вызов, воздействовать на несколько свойств объекта, в то время как defineProperty() работает лишь с одним свойством объекта.

Защита объектов

Периодически разработчику нужно защищать объекты от вмешательства извне. Например, учитывая гибкость JavaScript, очень легко по ошибке изменить свойства некоего объекта, которые меняться не должны. Существует три основных способа защиты объектов.

▍Метод Object.preventExtensions()

Метод Object.preventExtensions() предотвращает расширение объекта, то есть — добавление в него новых свойств. Он принимает объект и делает его нерасширяемым. Обратите внимание на то, что свойства из такого объекта можно удалять. Рассмотрим пример:

const obj = {
 id: 42
};
Object.preventExtensions(obj);
obj.name = ‘Arfat’;
console.log(obj);
// => { id: 42 }

Для того чтобы узнать, является ли некий объект нерасширяемым, можно воспользоваться методом Object.isExtensible(). Если он вернёт true, значит в объект можно добавлять новые свойства.

▍Метод Object.seal()

Метод seal() как бы «запечатывает» объекты. Вот о чём идёт речь:

  • Его применение предотвращает добавление в объект новых свойств (в этом он похож на Object.preventExtensions()).
  • Он делает все существующие свойства объекта неконфигурируемыми.
  • Значения существующих свойств, если их атрибут [[Writable]] не установлен в false, можно менять.

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

Рассмотрим пример:

const obj = {
 id: 42
};
Object.seal(obj);
delete obj.id
// (не работает)
obj.name = ‘Arfat’;
// (не работает)
console.log(obj);
// => { id: 42 }
Object.isExtensible(obj);
// => false
Object.isSealed(obj);
//=> true

Для проверки того, «запечатан» объект или нет, можно воспользоваться методом Object.isSealed().

▍Метод Object.freeze()

Метод freeze() позволяет «замораживать» объекты, оснащая их максимально возможным в JavaScript уровнем защиты. Вот как он работает:

  • «Запечатывает» объект с помощью Object.seal().
  • Полностью запрещает модификацию любых существующих свойств объекта.
  • Запрещает модификацию дескрипторов свойств.

Вот пример:

const obj = {
 id: 42
};
Object.freeze(obj);
delete obj.id
// (не работает)
obj.name = ‘Arfat’;
// (не работает)
console.log(obj);
// => { id: 42 }
Object.isExtensible(obj);
// => false
Object.isSealed(obj);
//=> true
Object.isFrozen(obj);
// => true

Проверить объект на то, «заморожен» ли он, можно с помощью метода Object.isFrozen().

▍Обзор методов, используемых для защиты объектов

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

Вот сводная таблица по рассмотренным методам защиты объектов, которая взята отсюда.

Создание свойстваЧтение свойстваПерезапись свойстваУдаление свойства
Object.freeze()+
Object.seal()++
Object.preventExtensions()+++

Итоги

Учитывая то, как часто объекты используются в JavaScript-коде, каждому разработчику важно знать о том, как они устроены. Надеемся, то, что вы узнали, прочтя этот материал, вам пригодится. К тому же, теперь вы знаете ответы на вопросы, перечисленные в начале статьи.

Уважаемые читатели! Как вы защищает JavaScript-объекты?

Источник