JavaScript의 게터와 세터에 대한 궁극적 인 가이드
게터 과 세터 사용 된 함수 또는 메소드 도망 과 세트 변수 값. getter-setter 개념은 다음과 같습니다. 컴퓨터 프로그래밍의 공통점: 거의 모든 고급 프로그래밍 언어에는 JavaScipt를 포함하여 getter 및 setter를 구현하는 구문 집합이 함께 제공됩니다..
이 게시물에서는 getters setters가 무엇인지, 그리고 자바 스크립트에서 만들고 사용하기.
Getters-setters 및 캡슐화
getters 및 setters의 아이디어는 항상 언급됩니다 캡슐화와 함께. 캡슐화가 가능하다. 두 가지 방식으로 이해하다.
첫째, 그것은 데이터 수집가 설정자 트리오를 사용하여 해당 데이터에 액세스하고 수정할 수 있습니다. 이 정의는 유효성 검사와 같은 일부 연산이 필요할 때 유용합니다. 데이터에 수행 저장하거나보기 전에 게터와 세터가 완벽한 홈을 제공합니다..
둘째로, 캡슐화가 수행되는 방식에 따라 더 엄격한 정의가 있습니다. 데이터 숨기기, 다른 코드에서 접근 불가능하게 만들기, 게터와 세터를 제외하고. 이렇게하면 우리는 끝나지 않는다. 우연히 중요한 데이터를 덮어 쓴다. 프로그램에 다른 코드가있다..
getter 및 setter 만들기
1. 메서드 사용
getter 및 setter는 기본적으로 함수 값을 가져 오거나 바꾼다. 하나 이상의 방법 그 (것)들을 창조하고 이용하기 위하여. 첫 번째 방법은 다음과 같습니다.
var obj = foo : '이것은 foo의 값입니다.', getFoo : function () return this.foo; , setFoo : function (val) this.foo = val; console.log (obj.getFoo ()); // "this는 foo의 값입니다."obj.setFoo ( 'hello'); console.log (obj.getFoo ()); // "여보세요"
이것은 가장 간단한 방법 게터와 세터를 만들 수 있습니다. 재산이있다. 푸
두 가지 방법이 있습니다. getFoo
과 setFoo
에 반환하고 값을 지정하십시오. 그 재산에.
2. 키워드 포함
더 “공무원” getter 및 setter를 만드는 강력한 방법은 도망
과 세트
키워드.
에 게터를 만든다., 두는 도망
예어 getter 메소드로 사용할 함수 선언 앞에 세트
예어 ~와 같은 방식으로 세터를 만들어라.. 구문은 다음과 같습니다.
var obj = fooVal : '이것은 foo의 값입니다.', get foo () return this.fooVal; , set foo (val) this.fooVal = val; console.log (obj.foo); // "this는 foo의 값입니다."obj.foo = 'hello'; console.log (obj.foo); // "여보세요"
데이터는 속성 이름으로 저장 (fooVal
) 그게 다른 getter-setter 메소드의 이름에서푸
) getter-setter를 보유하는 속성 데이터를 보유 할 수 없습니다. 게다가.
어느 쪽이 더 낫다.?
키워드로 getter 및 setter를 만드는 경우에는 할당 연산자를 사용하여 데이터 설정 그리고 도트 연산자를 사용하여 데이터 가져 오기, 일반 속성의 값에 액세스하거나 설정하는 것과 같은 방식입니다..
그러나 getter 및 setter를 코딩하는 첫 번째 방법을 선택하면 setter 및 getter 메서드를 호출해야합니다 함수 호출 구문 사용 왜냐하면 그것들은 전형적인 함수이기 때문에 ( 도망
과 세트
키워드).
또한 실수로 끝날 수도 있습니다. 다른 값 지정하기 그 getter-setter 메소드를 보유한 속성에 완전히 잃어 버리다.! 나중의 방법에서 걱정할 필요가없는 것.
그래서, 왜 내가 말했는지 알 수 있어요. 두 번째 기법은보다 견고하다..
덮어 쓰기 방지
어떤 이유로 첫 번째 기법을 선호하는 경우 getter-setter 메서드를 포함하는 속성을 만듭니다. 읽기 전용 그들을 창조함으로써 ~을 사용하여 Object.defineProperties
. 경유로 생성 된 등록 정보 Object.defineProperties
, Object.defineProperty
과 Reflect.defineProperty
자동 구성 에 쓰기 가능 : false
뜻 읽기 전용:
/ * 덮어 쓰기 방지 * / var obj = foo : '이것은 foo의 값입니다'; Object.defineProperties (obj, 'getFoo': value : function () return this.foo;, 'setFoo': value : function (val) this.foo = val;); obj.getFoo = 66; // getFoo는 덮어 쓰지 않을 것입니다! console.log (obj.getFoo ()); // "이것은 foo의 값입니다"
getter 및 setter 내부의 작업
일단 게터와 세터를 도입하면, 앞으로 나아갈 수 있습니다. 데이터 조작을 수행한다. 변경하거나 반환하기 전에.
아래 코드에서 getter 함수의 데이터는 다음과 같습니다. 문자열과 연결 반환되기 전에 setter 함수에서 값이 숫자인지 아닌지 여부 업데이트 전에 수행됩니다. 엔
.
var obj = n : 67, get id () return 'ID는 다음과 같습니다.'+ this.n; , set id (val) if (typeof val === 'number') this.n = val; console.log (obj.id); // "ID : 67"obj.id = 893; console.log (obj.id); // "ID : 893"obj.id = 'hello'; console.log (obj.id); // "ID : 893"
getter 및 setter를 사용하여 데이터 보호
지금까지 캡슐화의 첫 번째 컨텍스트에서 getter 및 setter의 사용에 대해 설명했습니다. 두 번째로 이동해 봅시다. 외부 코드에서 데이터 숨기기 게터와 세터의 도움으로.
보호되지 않은 데이터
getter와 setter의 설정은 해당 메소드를 통해서만 데이터에 액세스하고 변경할 수 있음을 의미하지 않습니다. 다음 예에서는 직접 변경됨 getter 및 setter 메서드를 건드리지 않고 :
var obj = fooVal : '이것은 foo의 값입니다.', get foo () return this.fooVal; , set foo (val) this.fooVal = val; obj.fooVal = 'hello'; console.log (obj.foo); // "여보세요"
우리는 세터를 사용하지 않았지만 직접 데이터를 변경했습니다 (fooVal
). 처음에 내부에서 설정 한 데이터 obj
이제 사라 졌어요! 이러한 일이 (실수로) 발생하지 않도록 약간의 보호가 필요하다. 귀하의 데이터. 추가 할 수 있습니다. 범위 제한 귀하의 데이터가있는 곳. 당신은 블록 범위 지정 또는 기능 범위 지정.
1. 블록 범위 지정
한가지 방법은 블록 범위 사용 그 안의 데이터는 방해
어느 키워드 범위를 제한하다 그 블록에.
에이 블록 범위 코드를 배치하여 만들 수 있습니다. 중괄호 쌍 안쪽. 블록 범위를 만들 때마다 코멘트를 남겨주세요 그 위에는 중괄호가 남겨 지도록 요청 했으므로 아무도 괄호를 제거하다 실수로 코드에 여분의 중괄호가 있다고 생각하거나 레이블을 추가하십시오. 블록 범위로.
/ * BLOCK SCOPE, 중괄호를 남겨주세요! * / let fooVal = '이것은 foo의 값입니다.'; var obj = get foo () return fooVal; , set foo (val) fooVal = val fooVal = 'hello'; // 블록 안의 fooVal에 영향을주지 않습니다. console.log (obj.foo); // "이것은 foo의 값입니다"
변경 / 생성 fooVal
블록 바깥 영향을 미치지 않습니다. 그만큼 fooVal
getters 세터 내부 참조.
2. 기능 범위 지정
범위 지정을 사용하여 데이터를 보호하는 가장 일반적인 방법은 데이터를 함수 내에 보관 과 객체 반환하기 그 함수에서 얻은 getter와 setter.
function myobj () var fooVal = '이것은 foo의 값입니다.'; return get foo () return fooVal; , set foo (val) fooVal = val fooVal = 'hello'; // 원래 fooVal에 영향을 미치지 않습니다. var obj = myobj (); console.log (obj.foo); // "이것은 foo의 값입니다"
객체 ( foo ()
그 안의 getter-setter)는 myobj ()
기능은 에 저장된 obj
, 그리고 obj
에 사용된다 getter와 setter를 호출하십시오..
3. 범위 지정없이 데이터 보호
또한 데이터를 덮어 쓰지 않도록 보호 할 수있는 또 다른 방법이 있습니다. 범위를 제한하지 않고. 그 뒤에있는 논리는 다음과 같습니다. 호출되는 것을 모르는 경우 어떻게 데이터 조각을 변경할 수 있습니까??
데이터에 그렇게 쉽게 재현 할 수없는 변수 / 속성 이름, 기회는 아무도 (심지어 우리 자신조차도) 변수 / 속성 이름에 어떤 값을 할당함으로써 그것을 덮어 쓰게 될 것입니다.
var obj = s89274934764 : '이것은 foo의 값입니다.', get foo () return this.s89274934764; , foo (val) this.s89274934764 = val; console.log (obj.foo); // "이것은 foo의 값입니다"
봐, 그건 일을하는 한 가지 방법이야. 내가 선택한 이름이 실제로 좋은 이름은 아니지만, 임의의 값 또는 기호 사용 이 블로그 게시물에서 Derick Bailey가 제안한대로 속성 이름을 만들 수 있습니다. 주요 목표는 데이터를 숨겨둔 채로 유지하라. 다른 코드에서 가져 와서 getter-setter 쌍으로 액세스 / 업데이트하도록하십시오..
getter 및 setter는 언제 사용해야합니까??
이제 큰 의문이 생깁니다 : 게터와 세터 할당을 시작합니까? 모든 데이터에 지금?
너라면 데이터 숨기기, 다음은 다른 선택의 여지가 없다..
그러나 다른 코드에서 볼 수있는 데이터가 괜찮 으면 getters setters를 사용해야합니다. 그것을 코드와 함께 묶기 만하면된다. 그것에 몇 가지 작업을 수행합니까? 나는 말할 것이다. 예. 암호 곧 추가된다.. 자체 getter-setter로 개별 데이터의 마이크로 단위 만들기 특정 독립성을 제공합니다. 코드의 다른 부분에 영향을 미치지 않고 상기 데이터를 처리한다..