Автор оригинала: FreeCodeCamp Community Member.
Вали Шах
Символы
Символы новые Примитивный Тип введен в ES6. Символы совершенно уникальные идентификаторы. Как и их примитивные аналоги ( Номер , String , Boolean ), они могут быть созданы с помощью функции завода Символ () который возвращает символ.
const symbol = Symbol('description')Каждый раз, когда вы вызываете заводскую функцию, создается новый и уникальный символ. Дополнительный параметр string-strade – это описательная строка, которая отображается при печати символа.
> symbol Symbol(description)
Каждый символ возвращен Символ () Уникален, поэтому каждый символ имеет свою идентичность:
> Symbol() === Symbol() false
Вы можете увидеть, что символы примитивны, если вы применяете Тип Оператор к одному из них – это вернет новый конкретный результат:
> typeof symbol 'symbol'
Используйте корпус: символы как ключи от недействительных свойств
Всякий раз, когда в JavaScript есть иерархии наследования, у вас есть два вида свойств (например, созданные через классы, чисто прототипный подход):
- Публичный Свойства видны клиентами кода
- Частный Свойства используются внутри предметов, которые составляют иерархию наследования (E.g. классы, объекты).
Для юзабилити, общественные свойства обычно имеют строковые ключей. Но для частных свойств со строчными ключами, случайные столкновения могут стать проблемой. Поэтому символы – хороший выбор.
Например, в следующем коде символы используются для частных свойств _Counter и _акция :
const _counter = Symbol('counter');
const _action = Symbol('action');
class Countdown {
constructor(counter, action) {
this[_counter] = counter;
this[_action] = action;
}
dec() {
let counter = this[_counter];
if (counter < 1) return;
counter--;
this[_counter] = counter;
if (counter === 0) {
this[_action]();
}
}
}Обратите внимание, что символы защищают вас только от навесов, а не от несанкционированного доступа. Вы можете узнать все клавиши свойств объекта – включая символы – через следующее:
const obj = {
[Symbol('my_key')] : 1,
enum : 2,
nonEnum : 3
};
Object.defineProperty(obj, 'nonEnum', { enumerable: false }); // Making 'nonEnum' as not enumerable.
// Ignores symbol-valued property keys:
> Object.getOwnPropertyNames(obj)
['enum', 'nonEnum']
// Ignores string-valued property keys:
> Object.getOwnPropertySymbols(obj)
[Symbol(my_key)]
// Considers all kinds of keys:
> Reflect.ownKeys(obj)
[Symbol(my_key),'enum', 'nonEnum']
// Only considers enumerable property keys that are strings:
> Object.keys(obj)
['enum']Нам действительно нужны символы?
Используйте символы, когда ваше требование является одним из них:
- Enum: Чтобы позволить вам определить константы с семантическими именами и уникальными значениями.
const directions = {
UP : Symbol( 'UP' ),
DOWN : Symbol( 'DOWN' ),
LEFT : Symbol( 'LEFT' ),
RIGHT: Symbol( 'RIGHT' )
};- Название столкновения: Когда вы хотели предотвратить столкновения с ключами в объектах
- Конфиденциальность: Когда вы не хотите, чтобы ваши объектные свойства перечислимы
- Протоколы: Чтобы определить, как можно итерацию объекта. Представьте, например, библиотека, как
ДрагулаОпределение протокола черезСимвол. Для (Драгула.маовы)Отказ Вы можете добавить метод на этомСимволк любому элементу DOM. Если элемент DOM следует протоколу, тоДрагуламог позвонить вEl [Symbol.for ('dragula.moves')]] ()Условный метод утверждения, может ли элемент можно перемещать. - Известные символы: В дополнение к пользовательским символам JavaScript имеет некоторые встроенные символы. Они представляют собой поведение внутреннего языка, которые не подвергались воздействию разработчиков в
здесь Отказ
Заключение
Символы В JavaScript может обеспечить уникальность уровня доступа к объектам. Для всех разработчиков все стоит иметь основное понимание их и их различных случаев использования.
код =. соревнование FFEE + департамент развитие