[class] ECMAScript 6 클래스의 게터와 세터는 무엇입니까?

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

어쨌든 gettersetter단지 스파이 같다. 객체의 속성을 감시하므로 속성의 값을 얻거나 설정할 때마다 무언가를 할 수 있습니다.


답변