15

ES6的新解构赋值特性现在已经广为人知(Babel 的 REPL 上的live copy );对于已经存在的变量:

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中有简单的converse吗?基于同名变量在现有对象上设置属性?(除了明显的o.a = a; o.b = b;

注意我不是在谈论创建对象时,我们可以使用美妙的新对象初始化器语法来做到这一点,这样我们就不会不必要地重复名称:

let a = "a";
let b = "b";
let o = {a, b};

但是如果我已经有一个对象,我可以在 ES6 中做某种结构赋值吗?

4

2 回答 2

11

我想出的最接近的是使用Object.assign和一个临时对象(实时副本):

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 中能做的最好的事情。带有稻草人的旧 wiki 已离线,提案 repo:=中没有任何内容。

于 2015-06-17T17:06:31.007 回答
1

一些实验性的东西,建立在你的答案之上。

如果你想变得有点厚脸皮,你可以用一个 setter 来模拟它的赋值部分。绝对不实用,但如果您可以清空 assign ,这是一种查看行为在外部可能是什么样子的有趣方式o[] =。(巴别塔

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};

您在回答时面临的同样问题,实际上更多,但值得深思。

于 2015-06-17T18:28:59.860 回答