2010-06-06 5 views
1

"with"문 안에있을 때 대괄호 표기법으로 만 액세스 할 수있는 개체 속성에 액세스 할 수 있습니까?"with"범위 및 특성 대괄호 표기법 사용

예 :

나는 특성이 자신의 이름으로 액세스 할 수 있도록 기본적으로, 오의 범위로 이동합니다 (O)로 알고있는 것처럼
var o = { "bad-property": 1, "another:bad:property": 2, "goodProperty": 3 }; 

with(o) { 
    console.log(goodProperty); // works awesome 
    console.log(???) // how to access "bad:property"? 
} 
+1

'with'로 끝내십시오. PLEASE –

+2

'with'는'goto' 나'eval'처럼 사용합니다. 제네릭 [유해한 것으로 간주] (http://en.wikipedia.org/wiki/Considered_harmful) 진술은 문제의 것보다 더 해롭다 고 생각합니다. – Anurag

+0

@ M28 나는 Anurag에 동의합니다. JavaScript의 아름다움 중 하나는 다재다능합니다. 이 게시물 http://stackoverflow.com/questions/61552/are-there-legitimate-uses-for-javascripts-with-statement를 참조하십시오. 그것은 위험을 가지고 있지만. – Laramie

답변

2

와우는 오래되었지만 여기에 나온 대답은 잘못되었습니다. 실제로 묻는대로 실제로하는 방법이 있습니다.

with({'[email protected]#$%': 'omg', d: 'hai'}) { 
    console.log(d); //hai - naturally 
    console.log(valueOf()['[email protected]#$%']); //omg - OMG 
} 

본 적이 있습니까? valueOf()은 마법의 단어입니다. 부모 객체의 프리미티브 값을 반환하거나 객체에 프리미티브 값이없는 경우 객체 자체를 반환합니다. 모든 객체와 객체 형 프리미티브는 Object.prototype에 내장 된 속성이므로이 메서드를 상속받습니다. 그래서 ... 거기 있네.

+0

조금 늦었지만'valueOf'에 감사드립니다. 이렇게하면 문제가 완전히 해결됩니다. – Anurag

0

: "나쁜"각각 "goodProperty".

with(o) { 
    bad="new value"; 
    goodProperty=22; 
} 
+1

질문은 이름으로 접근 할 수없는 속성에 액세스하는 방법입니다 (명명 방법을 통해). –

+0

혼란스러운 속성 이름을 추가했습니다. ''bad : property''는 속성의 이름입니다 (''bad-property''도 마찬가지 였을 수 있습니다). 그러나 그것이 범위 내에서 접근 가능한지 모르겠습니다. 한 가지 해결책은 속성 이름을 정규화하고''bad : property ''를''badProperty "'로 변경하는 것입니다. 그러나 어떤 경우에는 불가능할 수도 있으므로 피하려고합니다. – Anurag

1

일반적으로 키워드는 단일 개체 참조가 아닌 긴 네임 스페이스를 해결하는 데 사용됩니다. 나는 여기에 키워드를 사용하는 의도가 무엇인지 알 필요가 있다고 생각한다. 나는 구문 구문 분석기가 o.bad:property으로 빠져 나갈 수 있다고 믿지 않는다. 이는 기본적으로 함께 코딩되는 코드이다. 예제에서 o 객체가 더 이상 네임 스페이스에 단지 바로 가기라면

, 나의 추천 ...

다음과 같은 문자열로 귀하의 재산을 상자에 넣어 함께 사용하여 해상도 짧은 하나 개의 객체를 중지하는 것
var nmSpace = new Object(); 
nmSpace.o = { "bad:property": 1, "goodProperty": 2 }; 

with (nmSpace) { 
    alert(o['goodProperty']); // works awesome 
    alert(o['bad:property']); // now accesses "bad:property"! 
} 

희망이 있습니다.

+0

[JR의 작은 라이브러리] (http://ejohn.org/blog/javascript-micro-templating/)를 사용하는 템플릿에서 사용되고 있습니다. 데이터는 외부 소스에서 가져오고 관련 루트 객체를 채우는 템플릿 엔진에 전달합니다. 템플릿을 분리하지 않고 개체 체인을 임의로 끊을 수는 없습니다. – Anurag

+0

알았습니다.템플릿에 문자열에 영향을 주어 속성 이름을 한정 할 수 없다면 구문 위반을 피하기 위해 정규식을 통해 속성 이름을 정규화하지 않아도 돈을 받고있는 것 같습니다. – Laramie

+0

이러한 값에 액세스하는 유일한 방법은 따옴표 붙은 식별자를 사용하는 것입니다. o [ 'bad-property']와 o [ 'bad : property']는 여전히 작동합니다. 이것은'with' 내부에서 작동합니다 (그러나이 시점에서는 사용하지 않아도됩니다). 그리고 소품은'for (var s in o) {} '를 통해 여전히 얻을 수 있습니다. 템플릿 엔진이 객체의 속성 이름과 정확하게 일치하는 변수 이름을 예상하는 경우 이미 언급 한 것처럼 모든 작업을 정규화하지 않고 수행 할 수 있다고 생각하지 않습니다. – Andrew