2015-06-17 24 views
12

Tính năng gán mới phá hủy của ES6 hiện khá nổi tiếng (live copy trên REPL của Babel); trong trường hợp của các biến mà đã tồn tại:ES6 Cấu trúc chuyển nhượng?

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" 

đơn giản converse trong ES6? Đặt thuộc tính trên một đối tượng hiện có hiện có dựa trên các biến có cùng tên? (Khác với các rõ ràng o.a = a; o.b = b;)

Note Tôi không nói về việc khi nào tạo một đối tượng, chúng ta có thể làm điều đó với cú pháp đối tượng initializer mới tuyệt vời cho phép chúng ta không lặp lại những cái tên không cần thiết:

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

Nhưng nếu tôi đã có một đối tượng, tôi có thể thực hiện một số loại cấu trúc phân bổ trong ES6 không?

+1

Có vẻ như bạn muốn viết tắt của đối tượng khởi tạo để có thể 'mở rộng' các đối tượng hiện có. Tôi có hiểu đúng? – Mathletics

+0

@Mathletics: Hoặc một số cơ chế khác với loại kết quả đó, có. –

+0

Tôi không nhận được câu hỏi của bạn. Vì vậy, bạn có một đối tượng hiện có '{a:" a "}'. Bạn có một biến b với giá trị "b". Bạn muốn làm gì chính xác? –

Trả lời

10

Gần nhất tôi đã đi lên với là sử dụng Object.assign và một đối tượng tạm thời (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"} 

Đó là khá đơn giản, nhưng đó là một cuộc gọi chức năng và một đối tượng tạm thời.


Cập nhật:Bergi points out in a comment rằng there's a strawman proposal cho một nhà điều hành := rằng sẽ làm được điều này, và một trong những trường hợp sử dụng đầu tiên của họ thực sự là những trường hợp sử dụng mà chủ yếu đưa tôi đến với câu hỏi này: Constructors:

// 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 
     // ^^ 
    } 
} 

Vì vậy, với điều kiện người rơm đó tồn tại, tôi nghi ngờ hiện tại, assign sẽ là điều tốt nhất tôi có thể thực hiện trong ES6.

+1

Không có bất cứ điều gì tôi có thể nghĩ tốt hơn điều này. Vào cuối ngày, các thuộc tính viết tắt của đối tượng là cách duy nhất để thu gọn khóa và giá trị, do đó việc tạo một đối tượng tạm thời là cần thiết. – loganfsmyth

+0

@loganfsmyth: Cảm ơn. ES6 rất giàu có nên tôi đã tự hỏi liệu mình có bỏ sót điều gì không. Tôi đã nghĩ là sẽ nhận được một câu trả lời gần như ngay lập tức chỉ vào một cái gì đó rõ ràng và cảm thấy giống như một con cá heo. :-) –

+0

Điều này gần giống như bạn sẽ nhận được –

1

Một số nội dung thử nghiệm, xây dựng trên đầu câu trả lời của bạn.

Nếu bạn muốn nhận được một chút táo bạo, bạn có thể mô phỏng phần chuyển nhượng của nó với một setter. Chắc chắn không thực tế, nhưng đó là cách thú vị để xem hành vi có thể là gì trông giống như ở bên ngoài, nếu có thể bạn có thể trống chỉ định 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}; 

Các vấn đề tương tự bạn phải đối mặt với câu trả lời, thực sự nhiều hơn, nhưng một số thực phẩm cho suy nghĩ.

+1

Mắt tôi đau. Sáng tạo, mặc dù. –

Các vấn đề liên quan