2015-02-04 1 views
3

나는 에 대한 데이터 속성을 자바 스크립트 교과서에서 읽었으며 Object.defineProperty접근 자 속성과 함께 사용하는 것으로 상상합니다.Object.defineProperty의 주요 사용 사례는 무엇입니까?

속성을 설정하는 Object.defineProperty의 다른 주요 사용 사례는 다음과 같습니다. [[Enumerable]], [[Writable]], [[Configurable]]? 그것은 프레임 워크에서 사용됩니까? 어떤 이유로? 클라이언트 응용 프로그램에서 사용됩니까?

+2

[mdn] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty)은 일반적으로 매우 통찰력이 있으며 사용 사례를 말합니다. –

+0

주요 사용 사례는 속성을 정의하는 것입니다. –

답변

3

Object.defineProperty은 일반적으로 관련 메서드 Object.getOwnPropertyNames()Object.getOwnPropertyDescriptor()을 사용하여 한 개체에서 다른 개체로 속성 설명자를 복사하는 데 유용합니다. 프로토 타입에 물건을 병합 할 때.

앞에서 언급했듯이 getter 및 setter에 사용할 수 있습니다. 객체 리터럴 구문은 새 객체를 만들 때만 작동합니다. 기존 객체 (예 : 프로토 타입)에 새로운 getter/setter를 만들려면 Object.defineProperty()을 사용하거나 위에서 설명한대로 설명자를 복사해야합니다.

[Enumerable에서]

서브 어레이와 같은 속성을 추가 위해 ... 루프에서 Object.keys() 통해 열거되는 것을 방지하는 데 유용

. 내장 된 프로토 타입, 특히 Object.prototype에 폴리필을 추가 ​​할 때 이것은 매우 중요합니다. 추가 된 메소드가 갑자기 루프에 나타나기를 원하지 않으므로 .hasOwnProperty() 검사를 수행하지 않는 다른 코드를 깨뜨릴 수 있습니다.

[[쓰기 가능]], [[구성]

사람들은 새로운 프로그래밍 스타일을 가능하게하는 의미에서 정말 "유용",하지만 그들은 읽고 만들 수있는 정신 기능입니다 - 우연히 덮어 쓰거나 제거 할 수없는 속성. 그래서 그래, 그것은 도서관을 위해 훌륭하다.

Object.freeze()/.seal()/.preventExtensions()

당신의의 프로토 타입을 보호하여 다소 안전한 자바 스크립트 평가 샌드 박스를 만들 충분한 개체를 보호 할 수있는 점에 더욱 보호의이 종류를 확장 내장 객체.

+0

"getter 및 setter가 ES5에서 전용 구문을 갖고 있지 않다"는 것은 무엇을 의미합니까? – Bergi

+0

'freeze' /'seal' /'preventExtensions'는 [매우 ES5]입니다 (http://es5.github.io/#x15.2.3.8). – Bergi

+0

아 맞아요. 나는 메소드 단축형 선언을 생각하고있었습니다. 나는 그것을 편집 할 것이다. – the8472

관련 문제