ECMAScript 6 클래스에서 getter 및 setter의 요점이 무엇인지 혼란 스럽습니다. 목적은 무엇입니까? 아래는 제가 언급하는 예입니다.
class Employee {
constructor(name) {
this._name = name;
}
doWork() {
return `${this._name} is working`;
}
get name() {
return this._name.toUpperCase();
}
set name(newName){
if(newName){
this._name = newName;
}
}
}
답변
이러한 setter 및 getter를 사용하면 괄호를 사용하지 않고 속성을 직접 사용할 수 있습니다.
var emp = new Employee("TruMan1");
if (emp.name) {
// uses the get method in the background
}
emp.name = "New name"; // uses the setter in the background
이것은 속성의 값을 설정하고 얻는 것입니다.
답변
ES6의 getter 및 setter는 ES5를 포함하여 다른 언어에서 수행하는 것과 동일한 용도로 사용됩니다. ES5 Object.defineProperty
는 덜 깨끗하고 사용하기 더 번거롭지 만 이미을 통해 getter 및 setter를 허용 합니다.
효과적으로 getter 및 setter를 사용하면 읽기 및 쓰기에 표준 속성 액세스 표기법을 사용할 수 있으며 명시적인 getter 및 setter 메서드 없이도 속성을 검색하고 변경하는 방법을 사용자 지정할 수 있습니다.
위의 Employee 클래스에서 name
이것은 다음과 같이 속성에 액세스 할 수 있음을 의미합니다 .
console.log(someEmployee.name);
그것은 것 보면 일반적인 속성 액세스처럼,하지만 실제로 부를 것이다 toUpperCase
그것을 반환하기 전에 이름을. 마찬가지로 다음을 수행합니다.
someEmployee.name = null;
setter에 액세스하고의 setter에 _name
도입 된 guard 절 때문에 내부 속성을 수정하지 않습니다 name
.
일반적인 질문 인 왜 게터와 세터를 사용합니까?를 참조하십시오 . 회원 액세스 기능을 수정할 수있는 것이 유용한 이유에 대한 자세한 내용은
답변
ES6 getter 및 setter는 Java의 유사한 개념과 실질적으로 다른 동기를 갖습니다.
Java에서 getter 및 setter는 클래스가 JavaBean을 정의 할 수 있도록합니다. getter와 setter의 요점은 bean이 public 필드에서 암시하는 것과 완전히 직교하는 “인터페이스”를 가질 수 있다는 것입니다. 그래서 JavaBean 속성이 아닌 “name”필드를 가질 수 있고 필드가 아닌 JavaBean 속성 “address”를 가질 수 있습니다.
JavaBean 속성은 Java 리플렉션을 통해 수천 개의 프레임 워크 (예 : Hibernate)에서 “검색 가능”합니다. 따라서 getter 및 setter는 빈 속성을 “노출”하는 표준 방법의 일부입니다.
함수 인 게터와 세터도 구현을 “추상화”하는 값을가집니다. 필드 또는 계산 된 ( “합성”) 값일 수 있습니다. 따라서 “zipcode”라는 빈 속성이 있으면 저장된 문자열로 시작됩니다. 이제 주소 / 도시 / 주에서 계산 된 값으로 변경하고 싶다고 가정 해 보겠습니다.
필드를 사용하면이 코드가 중단됩니다.
String zipcode = address.zipcode();
그러나 게터를 사용하면 이것은 깨지지 않습니다.
String zipcode = address.getZipcode();
JavaScript에는 JavaBeans와 같은 것이 없습니다. 내가 읽은 한, GET 및 SET의 의도 된 값은 “합성”(계산 된) 속성으로 제한됩니다.
그러나 Java는 “필드”를 메소드로 호환성있게 변환 할 수 없지만 ES6 GET 및 SET는이를 허용한다는 점에서 Java보다 다소 낫습니다.
즉, 다음이있는 경우 :
var zipcode = address.zipcode;
zipcode를 표준 객체 속성에서 getter로 변경하면 위 코드는 이제 GET 함수를 호출합니다.
정의에 GET을 포함하지 않으면 zipcode GET 메서드가 호출되지 않습니다. 대신 var에 zipcode 함수를 할당 할뿐입니다.
따라서 Java 및 JavaScript ES6 getter 및 setter를 이해하는 데 중요한 차이점이 있다고 생각합니다.
답변
class Employee {
constructor(name) {
this._name = name;
}
doWork() {
return `${this._name} is working`;
}
get name() {
// when you get this by employeeInstance.mame
// the code below will be triggered
// and you can do some logic here
// just like `console.log` something you want
console.log('get triggered!')
return this._name.toUpperCase();
}
set name(newName) {
// the same as `get`
// when you employeeInstance.mame = 'xxx'
// the code blew will be trigged
// and you can also do some logic
// like here is a `console.log` and `if check`
console.log('set triggered!')
if (newName) {
this._name = newName;
}
}
}
const employeeInstance = new Employee('mike')
employeeInstance.name
employeeInstance.name = '' // this won't be success, because the `if check`
console.log(employeeInstance.name)
// =>
// get triggered
// set triggered
// get triggered
// MIKE
어쨌든 getter
및 setter
단지 스파이 같다. 객체의 속성을 감시하므로 속성의 값을 얻거나 설정할 때마다 무언가를 할 수 있습니다.