2013-06-21 36 views
8

Tại sao mã này làm việc ...Không thể xác định biến trong JavaScript object literal

var message = { 
    texts: { 
     text1: 'Hello', 
     text2: 'World' 
    }, 
    greet: function() { 
     console.log(this.texts.text1 + ' ' + this.texts.text2 + '!'); 
    } 
} 
message.greet(); 

... nhưng điều này không?

var message = { 
    texts: { 
     text1: 'Hello', 
     text2: 'World' 
    }, 
    both: this.texts.text1 + ' ' + this.texts.text2 + '!', 
    greet: function() { 
     console.log(this.both); 
    } 
} 
message.greet(); 

Nó mang lại cho tôi lỗi "cả hai không được xác định". Tôi đang thiếu gì ở đây? Đã xảy ra lỗi với this.both? Tôi là tổng số người mới khi nói đến đối tượng theo nghĩa đen

+0

'LoạiError: Không thể đọc thuộc tính 'text1' của undefined' –

+0

Chỉ là tôi hoặc cả hai ví dụ không hoạt động – aaronman

Trả lời

6

Vì trong trường hợp thứ hai this vẫn không tồn tại khi bạn xác định both. nếu bạn sẽ biến both thành phương pháp, như trong ví dụ này: http://jsfiddle.net/YyWMQ/, nó sẽ hoạt động.

both: function(){ return this.texts.text1 + ' ' + this.texts.text2 + '!'} 

IMHO, câu hỏi hay, +1

1
var message = { 
    texts: { 
     text1: 'Hello', 
     text2: 'World' 
    }, 
    // here this refers to the scope where message is defined 
    both: this.texts.text1 + ' ' + this.texts.text2 + '!', 
    greet: function() { 
     console.log(this.both); 
    } 
} 
message.greet(); 

Để hiểu nó, bạn có thể thử như đưa ra dưới đây

this.texts = { 
      text1: 'Alternate Hello', 
      text2: 'World' 
     }; 

var message = { 
     texts: { 
      text1: 'Hello', 
      text2: 'World' 
     }, 
     // here this refers to the scope where message is defined 
     both: this.texts.text1 + ' ' + this.texts.text2 + '!', 
     greet: function() { 
      console.log(this.both); 
     } 
    } 
message.greet(); 
1

sự hiểu lầm của bạn là ở dòng sau:

both: this.texts.text1 + ' ' + this.texts.text2 + '!', 

Bạn có thể sử dụng như thú vị ction và trả về một giá trị như:

both: function(){ return this.texts.text1 + ' ' + this.texts.text2 + '!'; } , 

Và cuối cùng

greet: function() { 
     console.log(this.both()); 
    } 
1

Khi gọi Greet, `này sẽ là obj phụ huynh, tin nhắn. Đây không phải là trường hợp khi bạn đang thực sự xây dựng đối tượng tin nhắn. Bạn có thể viết một cái gì đó tương tự như:

var Message = function() { 
    this.texts = { 
     text1: 'Hello', 
     text2: 'Word' 
    } 
    this.both = this.texts.text1 + ' ' + this.texts.text2 + '!'; 
} 

Message.prototype.greet = function() { 
    console.log(this.both); 
} 

message = new Message(); 
message.greet(); 
Các vấn đề liên quan