2011-09-15 31 views
12

thể trùng lặp:
Self-references in object literal declarationsObject tham khảo tài sản riêng của mình trên initilization

này có thể được thực hiện?(rõ ràng không phải trong cú pháp này)

var a = { 
    b : 10, 
    c : this.b * 2 // returns 'undefined' 
}; 

Tôi cũng đã cố gắng

var a = { 
    b : 10, 
    c : a.b * 2 // throws error 'a is undefined' 
}; 

var a = { 
    b : 10, 
    c : b * 2 // throws error 'b is undefined' 
}; 

Nó có ý nghĩa với tôi rằng những giá trị này là không xác định, tôi có không hoàn thành việc xác định chúng. Tuy nhiên có vẻ như với tôi như sẽ có một giải pháp để cơ cấu lại một đối tượng như thế và có c được điều kiện trên b

+0

Xem xét bạn đang khởi tạo 'b' tại thời gian biên dịch, tại sao' c' lại có điều kiện? Bạn đã biết nó là gì! –

+0

Những gì tôi đã đăng là một ví dụ đơn giản. Tôi sẽ không phải lúc nào cũng biết 'b' là gì. Nếu không tôi sẽ không cần phải có điều kiện. nghĩ rằng 'b: function (x) {/ * làm một số thứ */return y;},' – rlemon

+0

@Chad 1. JS không được biên dịch, 2. hoàn toàn bình thường để khởi tạo biến với biểu thức dựa trên biến khác và các ngôn ngữ khác (ví dụ C) quản lý nó hoàn toàn tốt. – Alnitak

Trả lời

10

Ngoài ra, bạn có thể sử dụng một chức năng tự khởi động để cung cấp cho bạn một tương tự ảnh hưởng đến những gì bạn đang tìm kiếm:

var a = (function() { 
    var b = 10; 
    return { 
     b:b, 
     c:b*2 
    } 
})(); 

console.log(a.c); 
+3

Tôi thích điều đó, dường như gần như * hacky * – rlemon

+1

@rlemon: nếu bạn thích điều đó, tại sao bạn không làm điều đó trong hai phần để làm mất hiệu lực của bạn trên toàn bộ chức năng? Trong thực tế, điều này là lộn xộn. Nó vẫn đang làm tất cả mọi thứ trong hai bước và trên hết, bạn đang gọi một chức năng không cần thiết. – vol7ron

1

Không sử dụng ký hiệu literal đối tượng, nhưng bạn có thể sử dụng chức năng để tạo ra nó:

function Structure(value) { 
    this.b = value; 
    this.c = 2 * value; 
} 

var a = new Structure(10); 

hoặc

function makeStructure(value) { 
    return {b:value, c:2*value}; 
} 

var a = makeStructure(10); 
Các vấn đề liên quan