Как удалить все свойства в текущую область/закрытие в 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
везде. А также не нужно продолжать добавлять свойства к деструкции, если данные изменяются.
Ответы
Ответ 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!