2014-02-13 2 views
0

JavaScript에 대한 몇 권의 책을 읽었으며 OOP를 사용하여 웹 응용 프로그램을 작성하는 데 매우 강력한 언어입니다. 그러나 지금은 문제가 있습니다. 해결할 수 있습니다Object.defineProperty 및 해당 '가져 오기'기능 사용

var myObj = {}; 
myObj.properties = {}; 
myObj.properties.myProperty = 'foo'; 

가 설명해 드리죠, 내가 foo을 얻을 것이다 내가 myObj.properties.myProperty에 대한 을 요구하는 경우 지금은, 지금 ... 내부 properties 객체를 살고 있고 .. myObj 있습니다. 그러나 myObj.properties.notSettedValue을 요청하면 어떻게됩니까? (즉, undefined)

나는 속성에 setter와 getter를 설정할 수있는 MDN에 대해 Object.defineProperty을 읽었습니다.

나는 myObj.properties

Object.defineProperty(myObj, 'properties', { 
    get : function(){ 
     console.log("called custom get property.", this, arguments); 
    } 
}); 

"get" 값을 설정하려고 ...하지만 아무는 get 기능은 자체에 대한 myObj.properties 일을 선언하지 않습니다. 사용자 정의 함수는 myObj.properties을 요청한 경우에만 호출됩니다. 그것의 아이들을 위해 아닙니다.

요청한 myObj.properties.notSettedValueget 기능에 전달하는 해결책은 myObj.properties입니까?

답변

0

기본적으로 무엇을 요구하는지 것은이 코드는 '아무튼 객체에서 속성을 검색하려고하면 호출되는 함수를 설정 가능 여부 (함수 나 myObj.properties.getItem('notSettedValue') 같은 방법을 사용하지 않고) 그 객체에는 존재하지 않습니다.

아니요, JavaScript에는 해당 기능이 없습니다. ES6의 proxies은 아주 비슷한 것을 만들지 만 ES5에서는 "모든 것을 잡을"게터 기능이 없습니다.

그런 종류의 포괄적 인 작업을 수행하는 유일한 ES5 호환 메커니즘은 앞서 말한 것처럼 속성 (getItem)이 아닌 함수를 사용하는 것입니다.

+0

나는 의심 스럽다. 자바 스크립트에는 몇 가지 "마법"기능이 있지만 모든 것이 현재 가능하지는 않다. ES3에서 ES5로 10 년 이상이 경과했다 ... ES6을 몇 번이나 기다릴 것인가? ? ... – Salcos

+0

@Salcos :별로 오래 있지 않아, 나는 기쁜 듯이 말하고있다. 관련 사람들이 함께 행동합니다. 최신 [ES6의 사양 초안] (http://wiki.ecmascript.org/doku.php?id=harmony:specification_drafts)을 볼 수 있습니다.나는 2014 년에 완결 될 것이라고 생각하지 않지만, 2015 년에 그럴 것이라고 생각한다. 5.0 년 이후 약 6 년이고 5.1 년 이후 4 년이다. 그러나 ES6는 ES5에 비해 * 큰 변화 *입니다. –

0

JavaScript의 개체는 동적입니다. 예를 들어 당신이했던 것처럼 새로운 속성을 즉석에서 추가 할 수 있습니다. myObj.properties = {}

myObj 인스턴스에서 통역사가 properties이라는 속성을 찾으려고하는 것입니다. 그러한 속성이 없으면 프로토 타입 체인을 탐색합니다. 이 예제에서는 myObj이 객체 리터럴이므로 Object 생성자의 프로토 타입을 방문합니다. 프로토 타입 체인에서 해당 속성을 찾을 수없는 경우 해당 속성을 만들어 개체의 새 멤버로 추가합니다.

속성을 읽으려는 경우에도 마찬가지입니다. 그러나이 경우 요청 된 속성을 찾을 수없는 경우 undefined를 반환합니다. 따라서 명시 적으로 속성을 정의하지 않으면 항상 정의되지 않은 값이 반환됩니다. 이는 단순 속성과 ES5 속성에 액세스 할 때 모두 적용됩니다.

+0

이 질문에 대답하지 않습니다. OP가 이미 (대부분) 이해하고있는 것처럼, 속성이 어떻게 작동 하는지를 설명합니다. –

+0

글쎄 그것은 그가 이해하지 못하는 것 같다 – ppoliani

+0

질문은 조금 복잡하지만 상당히 명확하다. 코드가 존재하지 않는 속성을 액세스 할 때 호출되는 함수를 얻는 방법이 있는가? –

관련 문제