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

Назначение структурирования 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?

4b9b3361

Ответ 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};

Те же проблемы, с которыми вы сталкиваетесь с вашим ответом, на самом деле больше, но пища для размышлений.