2011-04-10 3 views
2

이것은 초보자 용 질문 일 수 있습니다. 나는 수년간 javascript를 사용해 왔지만, 그것에 대해서 "진지하게"생각하기 시작했습니다. 나는에 대한 질문이 "이"JavaScript의 "this"에 대한 질문

var defaults = { 
    baseId : 'item_', 
    baseName : this.baseId 
} 

console.log('defaults',defaults); 

하지 defaults.baseName는 "정의되지 않은"이유를 확인하는 방법 중괄호에 하나 개의 기준 물건을합니까? 가능합니까, 아니면 정말로 'item_'을 두 번 입력해야합니까?

+1

나는 = 당신은'VAR 접두사를 할 제안 'item_''을하고 당신이 그것을 –

+0

도 http://www.quirksmode.org/js에서 살펴 필요할 때의 값을지도에 추가 할 것을 사용할 것 /this.html –

답변

2

자바 스크립트 객체 리터럴을하는 것은 따라서 작동하지 않는 syntatic 설탕이다. 당신은 getter 및 setter를 사용할 수 있습니다

this; // point A 
var defaults = new Object(); 
defaults.baseId = 'item_'; 
defaults.baseName = this.baseId; // "this" here is same as "this" at point A 

this; // at point A 
var defaults = { 
    baseId : 'item_', 
    baseName : this.baseId 
} 

은 변환합니다.

{ 
    baseId: 'item_', 
    get baseName() { return this.baseId; }, 
    set baseName(x) { this.baseId = x } 
} 
1

당신은 class의 상응을 만드는 대신 function를 사용할 수 있습니다

function defaults() { 
    this.baseId = 'item_'; 
    this.baseName = this.baseId; 
} 

지금 this가 적절한 상황이있을 것이다.

또 다른 옵션은, 원래의 코드를 사용하여, 기능을 baseName하고있다 :

var defaults = { 
    baseId : 'item_', 
    baseName : function() { return this.baseId; } 
}; 

감사 SIME VIDAS을 보정!

+1

'defaults'를 두 번 쓸 필요는 없습니다. 다음과 같이 작성할 수 있습니다 :'return this.baseId;' –

3

간단한 대답은 당신이하려는 일을 할 수 없다는 것입니다. 파싱 ​​/ 해석/평가 (객체에 대해 생각하고 싶지만) 객체 리터럴 중에는 존재하지 않으므로 이와 같은 방식으로는 참조 할 수 없습니다.

2

당신은이 작업을 수행 할 수 있습니다 :

var defaults = {}; 
defaults.baseId = defaults.baseName = 'item_';