Как я могу получить значение свойства Symbol - PullRequest
0 голосов
/ 21 мая 2018

У меня есть объект в NodeJS (сокет, если быть точным).

Когда я его печатаю, я вижу, что одна из записей такова:

[Symbol(asyncId)]: 2781 // the numeric value changes

Как я могуполучить значение такого ключа?

Я пытался socket['[Symbol(asyncId)]'], но получил undefined.

Выражение socket.[Symbol(asyncId)], очевидно, не будет работать.

Спасибо:)

Ответы [ 3 ]

0 голосов
/ 21 мая 2018

Вы не сможете получить доступ к нему напрямую по ключу, если у вас нет ссылки на фактическое: Symbol('asyncId'), потому что каждый символ уникален

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

Что вы можете сделать, это перебрать собственные ключи свойств объекта, используя Reflect.ownKeys , который будет включать в себя обычные свойства &символов, а затем получите эту ссылку.

Вы также можете использовать: Object.getOwnPropertySymbols ()

function getObject() {
   // You don't have access to this symbol, outside of this scope.
  const symbol = Symbol('asyncId');

  return {
    foo: 'bar',
    [symbol]: 42
  };

}

const obj = getObject();

console.log(obj);
console.log(obj[Symbol('asyncId')]); // undefined

// or Object.getOwnPropertySymbols(obj)
const symbolKey = Reflect.ownKeys(obj)
  .find(key => key.toString() === 'Symbol(asyncId)')
  
console.log(obj[symbolKey]); // 42
 

ПРИМЕЧАНИЕ: Объект может иметь несколько клавиш, где key.toString() === 'Symbol(asyncId)', это не будет обычным, но имейте в виду, так что вы можете захотетьиспользуйте другую функцию, кроме .find, если это так.

ПРИМЕЧАНИЕ II : вам не следует изменять значение этого свойства, поскольку оно предназначено только для внутреннего доступа, даже еслисвойство не только для чтения.

function getObject() {
       // You don't have access to this symbol, outside of this scope.
      const symbol = Symbol('asyncId');
      const symbol2 = Symbol('asyncId');

      return {
        foo: 'bar',
        [symbol]: 'the value I don\'t want',
        [symbol2]: 'the value I want'
      };

}
const obj = getObject();

const symbolKey = Reflect.ownKeys(obj)
  .find(key => key.toString() === 'Symbol(asyncId)')
  
console.log(obj[symbolKey]); // the value I don't want

console.log('=== All values ===');
Reflect.ownKeys(obj)
  .forEach(key => console.log(obj[key]));
0 голосов
/ 21 мая 2018

Используйте Object.getOwnPropertySymbols (obj) и итерируйте по нему

0 голосов
/ 21 мая 2018

Необходимо заранее сохранить Symbol и использовать его в качестве средства доступа к объекту.

Каждое значение символа, возвращаемое из Symbol(), является уникальным.Значение символа может использоваться в качестве идентификатора для свойств объекта;это единственная цель типа данных.Некоторое дальнейшее объяснение цели и использования можно найти в записи глоссария для Symbol .

var asyncId = 42,
    symbol = Symbol(asyncId),
    object = { [symbol]: 2781 };

console.log(object[symbol]);
console.log(symbol.toString());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...