Подтвердить что ты не робот

Как удалить все свойства в текущую область/закрытие в ES2015?

Я хотел бы сделать что-то вроде этого:

const vegetableColors = {corn: 'yellow', peas: 'green'};

const {*} = vegetableColors;

console.log(corn);// yellow
console.log(peas);// green

Кажется, я не могу найти или понять, как это сделать, но я действительно думал, что видел это где-то раньше!: P

ПРИМЕЧАНИЕ: Я использую Babel с stage, установленным на 0;

КОНТЕКСТ: Я пытаюсь быть более сухим в JSX, а не ссылкой this.state или this.props везде. А также не нужно продолжать добавлять свойства к деструкции, если данные изменяются.

4b9b3361

Ответ 1

Я думаю, что вы ищете выражение with выражением, оно делает именно то, о чем вы просите:

const vegetableColors = {corn: 'yellow', peas: 'green'};
with (vegetableColors) {
    console.log(corn);// yellow
    console.log(peas);// green
}

Тем не менее, он устарел (в строгом режиме, который включает модули ES6), по уважительной причине.

разрушить все свойства в текущем объеме

Вы не можете в ES6 1. И это хорошо. Будьте откровенны в отношении переменных, которые вы вводите:

const {corn, peas} = vegetableColors;

Кроме того, вы можете расширить глобальный объект с Object.assign(global, vegetableColors), чтобы поместить их в глобальном масштабе, но на самом деле, что хуже, чем with выражением.

1:... и пока я не знаю, есть ли проект, разрешающий такие вещи в ES7, я могу сказать вам, что любое предложение будет уничтожено TC :-)

Ответ 2

Я думаю, что вы ищете:

const {corn, peas} = vegetableColors;

Live on Babel REPL


Если верно указал, что вы спрашиваете, как это сделать, не зная имен corn и peas, вы не сможете с деструктивным назначением.

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

// I'm sure you don't really want this, just being thorough
Object.keys(vegetableColors).forEach((key) => {
    Object.defineProperty(this, key, {
        value: vegetableColors[key]
    });
});

(Добавьте туда enumerable: true, если хотите, чтобы эти псевдоконстанты были перечисляемыми.)

Это работает в глобальном масштабе, потому что this ссылается на глобальный объект.

Ответ 3

Кажется, это работает для меня:

function intoLocal(obj) {
  Object.assign(this, obj);
  console.log(localProp);
}

intoLocal({
  localProp: 'it works!'
});
// => it works!