2011-01-06 23 views
32

Tôi cố gắng để làm một cái gì đó như thế này:Tôi có thể tham khảo các thuộc tính khác trong khi khai báo đối tượng trong JavaScript không?

var obj = { 
    a: 5, 
    b: this.a + 1 
} 

(thay vì 5 có một chức năng mà tôi không muốn thực hiện hai lần mà trả về một số)

tôi có thể viết lại nó để gán obj.b sau đó từ obj.a, nhưng tôi có thể làm điều đó ngay lập tức trong khi khai báo không?

+2

Bạn đã thử nó?!? – ken

+0

@ken 'this.a' là không xác định – serg

+0

' javascript: var obj = {a: 5, b: this.a + 1}; cảnh báo (obj.b); 'cảnh báo NaN, vì vậy không. – Ben

Trả lời

27

Số this trong JavaScript không hoạt động như bạn nghĩ. this trong trường hợp này đề cập đến đối tượng chung.

Chỉ có 3 trường hợp trong đó giá trị this được thiết lập:

Chức năng Trường hợp

foo(); 

Đây this sẽ đề cập đến đối tượng toàn cầu.

Phương pháp Trường hợp

test.foo(); 

Trong ví dụ này this sẽ đề cập đến test.

Các Constructor Trường hợp

new foo(); 

Một cuộc gọi chức năng đó là trước bởi các hành vi new từ khóa như một constructor. Bên trong hàm this sẽ tham chiếu đến một số mới được tạo Object.

Ở mọi nơi khác, this đề cập đến đối tượng chung.

+1

+1 Câu trả lời hay. Tôi chỉ thêm trường hợp khi 'this' được đặt rõ ràng bằng cách sử dụng hàm hoặc phương thức của trường hợp thông qua' .call() 'hoặc' .apply() '. (Có lẽ nhiều hơn một tập hợp con của hai trường hợp đó.) – user113716

+0

Có, những thứ đó có thể được thêm vào, nhưng chúng nằm ngoài phạm vi ở đây IMO, mặc dù tôi sẽ thêm chúng vào tài liệu của tôi. –

+0

Tôi đồng ý. Tôi nghĩ câu trả lời của bạn bao gồm các căn cứ cần thiết cho câu hỏi. – user113716

4

này sẽ trả về các giá trị chính xác:

function() { 
    var aVar = 5; 
    var bVar = aVar + 1; 

return { 
    a : aVar, 
    b : bVar; 
} 
}(); 
2

Không, trong ví dụ của bạn, giá trị của this không đề cập đến đối tượng chữ.

Bạn cần gán giá trị cho b sau khi đối tượng đã được tạo để đặt nó trên một thuộc tính khác trong obj.

1

No. this sẽ có cùng ý nghĩa như bên ngoài định nghĩa.

0

trong debugger chrome

> var o = {a: 5, b: this.a+1} 
undefined 
> o.b 
NaN 
> o.a 
5 
6

Có một số cách để thực hiện điều này; đây là những gì tôi sẽ sử dụng:

function Obj() { 
    this.a = 5; 
    this.b = this.a + 1; 
    // return this; // commented out because this happens automatically 
} 

var o = new Obj(); 
o.b; // === 6 
2

Khi hóa ra bạn không thể tham chiếu một đối tượng bên trong đối tượng khác trừ khi đối tượng đầu tiên là một hàm. Nhưng bạn có thể làm theo cách này.

var obj = { 
     a: 5 
    } 

    obj.b = obj.a + 1; // create field b in runtime and assign it's value 

Nếu bạn console.log (obj), bạn sẽ có

obj = { 
     a: 5, 
     b: 6 
    } 

Bằng cách này bạn giữ các đối tượng cấu trúc theo nghĩa đen cho phần còn lại của mã

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