Назначение структурирования ES6?
Новые функции назначения деструктуризации ES6 довольно хорошо известны (живая копия на Babel РЕПЛ); в случае уже существующих переменных:
let a, b; // Existing variables
let o = {a: "a", b: "b"}; // An object to get values from
// ...
({a, b} = o); // Set them to the props from `o`
console.log(a); // "a"
console.log(b); // "b"
Существует ли простая схема в ES6? Настройка свойств объекта существующего на основе переменных с тем же именем? (За исключением очевидного o.a = a; o.b = b;
)
Примечание. Я не говорю о создании объекта, мы можем сделать это с помощью замечательного синтаксиса инициализатора нового объекта, который позволяет нам не повторять имена без необходимости:
let a = "a";
let b = "b";
let o = {a, b};
Но если у меня уже есть объект, могу ли я сделать какое-то структурирование в ES6?
Ответы
Ответ 1
Самое близкое, что я придумал, это использовать Object.assign
и временный объект (live copy):
let a = "a", b = "b"; // The variables
let obj = {c: "c"}; // The existing object
Object.assign(obj, {a, b}); // "Structuring" assignment, sort of
console.log(JSON.stringify(obj)); // "{"c":"c","a":"a","b":"b"}
Это довольно просто, но это вызов функции и временный объект.
Обновление: Bergi указывает в комментарии, что есть предложение соломы для оператора :=
, который сделает это, и один из их первых случаев использования действительно является прецедентом, который в первую очередь приводит меня на этот вопрос: Конструкторы:
// From strawman proposal linked above, doesn't actually exist yet!
class Point {
constructor(x,y) {
this := {x,y} //define and initialize x and y properties of new object
// ^^
}
}
Итак, учитывая, что солома существует, я подозреваю, что теперь assign
будет лучшим, что я могу сделать в ES6.
Ответ 2
Некоторые экспериментальные материалы, основываясь на вашем ответе.
Если вы хотите немного нахально, вы можете эмулировать часть его назначения с помощью сеттера. Определенно непрактично, но это забавный способ увидеть, как поведение может выглядеть снаружи, если возможно, вы можете сбросить назначение o[] =
. (Babel)
let a = '1', b = '2';
let o = {z: '26'};
Object.defineProperty(Object.prototype, '', {
set: function (o) {
Object.assign(this, o);
}, configurable: true
});
o[''] = {a, b};
Те же проблемы, с которыми вы сталкиваетесь с вашим ответом, на самом деле больше, но пища для размышлений.