속성 디스크립터는 ES5에 추가 된 새로운 개념이며, 그 기능은 객체의 속성에 더 많은 제어를 추가하는 것입니다.
Object.DefineProperty
속성 설명자를 연구하려면 먼저 Object.DefineProperty 메소드에 대해 이야기해야합니다. 이 방법의 목적은 객체에 대한 새로운 속성을 정의하거나 기존 속성을 수정하는 것입니다. 프로토 타입은 다음과 같습니다.
코드 사본은 다음과 같습니다.
Object.DefineProperty (OBJ, Prop, Destcriptor)
사용의 예 :
코드 사본은 다음과 같습니다.
var obj = {};
object.defineProperty (obj, 'attr', {value : 1});
위의 코드는 attrict를 OBJ 객체에 이름을 1. 1에 해당합니다.
코드 사본은 다음과 같습니다.
var obj = {};
obj.attr = 1;
이에 비해 Object.DefineProperty의 글쓰기가 더 복잡해 보입니다. 그러나 가장 큰 비밀은 세 번째 매개 변수에 있습니다.
데이터 디스크립터
attr이 읽기 전용 속성이되기를 원한다고 가정하면 쓰기 가능한 데이터 디스크립터를 추가 할 수 있습니다.
코드 사본은 다음과 같습니다.
var obj = {};
object.defineProperty (obj, 'attr', {
가치 : 1,
쓰기 가능 : 거짓
});
console.log (obj.attr);
obj.attr = 2; // 실패하다
console.log (obj.attr);
위의 프로그램을 실행하면 두 번 인쇄 된 attr의 값이 1이라는 것을 알게됩니다. 그러나 할당 문의 실행에는 예외가 없지만 실패하기 때문에이 결과는 약간 설명 할 수 없습니다. 블록버스터 코드에서 그러한 문제가 발생하면 문제를 해결하기가 어려울 것이라고 상상해보십시오. 실제로 코드가 엄격한 모드로 실행되는 한 예외가 생성됩니다.
코드 사본은 다음과 같습니다.
'엄격한 사용'; // 엄격한 모드로 들어갑니다
var obj = {};
object.defineProperty (obj, 'attr', {
가치 : 1,
쓰기 가능 : 거짓
});
obj.attr = 2; // 예외를 던집니다
속성을 열거 할 수 있는지 여부를 제어 할 수있는 다른 데이터 디스크립터 열거 가능한 다른 데이터 디스크립터를 살펴 보겠습니다. 단순히 속성을 정의하는 경우이 속성은 For ... In Loop에 열거 될 수 있습니다.
코드 사본은 다음과 같습니다.
var obj = {};
obj.attr = 1;
for (obj in obj) {console.log (obj [i]); }
열거 할 수있는 것은 "숨기기"할 수 있습니다.
var obj = {};
object.defineProperty (obj, 'attr', {
가치 : 1,
열거 가능 : 거짓
});
for (obj in obj) {console.log (obj [i]); }
위의 코드를 실행하면이 시점에서 attrippribute를 열거 할 수 없기 때문에 콘솔이 아무것도 출력하지 않습니다.
그 말을하면 질문이있을 수 있습니다. 속성 설명자를 수정할 수 있습니까? 예를 들어, 읽기 전용 속성을 다시 쓸 수있는 것으로 정의 할 수 있습니까? 실제로 이는 다른 데이터 디스크립터 구성 가능에 따라 속성 디스크립터를 변경할 수 있는지 여부를 제어 할 수 있습니다.
코드 사본은 다음과 같습니다.
var obj = {};
object.defineProperty (obj, 'attr', {
가치 : 1,
쓰기 가능 : 거짓,
구성 가능 : true
});
object.defineProperty (obj, 'attr', {
쓰기 가능 : 사실
});
obj.attr = 2;
위의 코드는 먼저 atts를 읽기 전용 속성으로 정의한 다음이를 쓸 수있는 것으로 재정의합니다. 그래서 Att에 대한 글은 성공적입니다.
액세스 설명자
액세스 디스크립터는 객체 지향의 get/set 액세서와 유사합니다.
코드 사본은 다음과 같습니다.
var obj = {};
object.defineProperty (obj, 'attr', {
set : function (val) {this._attr = math.max (0, val); },
get : function () {return this._attr; }
});
obj.attr = -1;
console.log (obj.attr); // 0
위의 코드에서 attr에 대한 액세스는 실제로 _attr에 대한 액세스가되고 최소값은 설정 함수에서 0으로 제한됩니다.
속성 설명자를 가져옵니다
위에서 언급 한 것은 모두 속성 설명자를 설정하는 것이므로 세트 설명자를 얻는 방법은 무엇입니까? object.getownPropertyDescriptor가이를 수행 할 수 있습니다.
코드 사본은 다음과 같습니다.
var obj = {};
object.defineProperty (obj, 'attr', {
가치 : 1,
쓰기 가능 : 거짓,
구성 가능 : true
});
var desc = object.getOwnPropertyDescriptor (obj, 'attr');
Console.dir (DESC);
객체 제어
Object.defineProperty 앞에서 언급 한 객체의 속성에서 작동하는 반면 아래에 언급 된 세 가지 방법은 객체에서 직접 작동합니다.
object.preventextensions는 객체에 새로운 속성을 갖지 못하게 할 수 있습니다.
코드 사본은 다음과 같습니다.
var obj = {};
obj.attr = 1;
object.preventextensions (obj);
obj.attr2 = 2; //실패하다
객체 .SEAL은 객체를 수정해야 할 속성 값 만 만들 수 있습니다 (속성이 읽기 전용 인 경우 속성 값조차 수정할 수 없습니다).
코드 사본은 다음과 같습니다.
var obj = {};
obj.attr = 1;
객체 .seal (obj);
obj.attr = 1.5;
obj.attr 삭제; // 실패하다
객체. freeze는 물체를 완전히 수정하지 못하게 할 수 있습니다.
코드 사본은 다음과 같습니다.
var obj = {};
obj.attr = 1;
객체. freeze (obj);
obj.attr = 1.5; // 실패하다
obj.attr2 = 2; //실패하다
그러면 다시 물어볼 수 있습니다. 물체가 예방 대회인지, 봉인 또는 동결인지 어떻게 알 수 있습니까? 대답은 개체를 호출하는 것입니다. 이 세 가지 기능의 사용은 비교적 간단하고 더 이상 번거롭지 않습니다.
일반적으로 객체는 속성 설명자를 통해 더 엄격하게 제어 될 수 있으며 프로그램 논리의 엄격함이 강화됩니다. 유일한 단점은 ES5가 기본적으로 IE9에서 구현된다는 것입니다 (IE9는 아직 엄격한 모드를 지원하지 않습니다). 국내 IE8 점유율이 여전히 비교적 높다는 점을 고려할 때,이 사물 세트는 모바일 브라우저 및 Node.js에서만 사용할 수 있습니다.