Имя переменной ссылочного объекта внутри самого объекта - PullRequest
1 голос
/ 13 мая 2019

Можно ли ссылаться на имя объявления переменной объекта внутри самого объекта? Что-то вроде:

const foo = {
  bar: `${MAGICTHIS}-bar`,
}

console.log(foo.bar); //foo-bar

EDIT:

Я пишу динамическую функцию для перезаписи всех моих имен классов CSS в BEM в объекте. Я делаю это, чтобы иметь возможность управлять ими в одном месте через мое приложение. Без функции это так:

export const button = {
  btn: 'button',
  btnSm: 'button--small',
  btn2: 'button--secondary',

export const alert = { 
  alert: 'alert',
  alertDanger: 'alert--danger',
//etc
}

Они разделены на разные объекты, потому что я хочу изолировать использование. Я хотел оптимизировать это, так как я буду делать это много. Вот почему я пытаюсь написать функцию «ошеломить». Так что я могу сделать это:

export const button = {
  btn: bemmify(),
  btnSm: bemmify('small'),
  btn2: bemmify('secondary'),

export const alert = { 
  alert: bemmify(),
  alertDanger: bemmify('danger'),
//etc
}

И имеют тот же результат, что и объекты выше. Конечно, я всегда мог передать «базу» в качестве первого параметра (bemmify('button', 'small')), но я начал задаваться вопросом, можно ли было позволить моей функции bemmify быть настолько умной, чтобы она могла распознавать имя объекта, в котором она находится.

1 Ответ

5 голосов
/ 13 мая 2019

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

const bem_data = {
  button: {
    btn: 'button',
    btnSm: 'button--small',
    btn2: 'button--secondary',
  },
  alert: {
    alert: 'alert',
    alertDanger: 'alert--danger',
  }
}

Затем вы можете использовать функцию для создания каждого элемента:

function add_element(data, key, prefix, additional) {
  const obj = {
    [prefix]: key
  };
  Object.entries(additional).forEach(([
    keySuffix,
    valSuffix
  ]) => obj[prefix + keySuffix] = `${key}--${valSuffix}`);
  data[key] = obj;
}

const bem_data = {};
add_element(bem_data, "button", "btn", {
  Sm: "small",
  "2": "secondary"
});
add_element(bem_data, "alert", "alert", {
  Danger: "danger"
});

console.log(bem_data);

Затем вы экспортируете bem_data и используете bem_data.button, bem_data.alert и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...