ES6 게터 / 세터 (화살표 기능 포함)


105

나는 babel6을 사용하고 있고 내 애완 동물 프로젝트를 위해 사용할 수있는 방법에 대해 XMLHttpRequest에 대한 래퍼를 만들고 있습니다.

open = (method, url, something) => {
  return this.xhr.open(method, url, something);
}

하지만 속성 화살표 기능이 작동하지 않습니다.

이것은 작동합니다 :

get status() { return this.xhr.status; }

하지만 사용할 수 없습니다

get status = () => this.xhr.status;

의도적입니까?


중괄호 나 리턴은 필요하지 않습니다. 그냥 말할 수 있습니다 (method, url, something) => this.xhr.open(method. url, something).

get객체 리터럴 또는 클래스 정의의 일부이지만 변수 할당은 그렇지 않습니다. 왜 그들이 똑같이 작동해야한다고 생각합니까?
Bergi

2
status => this.xhr.status(c # 7 구문) 또는 아마도 get status() => this.xhr.status가독성을위한 훌륭한 구문 설탕이었을 것입니다. 그러나 Javascript는 Typescript가 지원하지 않습니다 (아직?)
Charles HETIER

답변:


113

ES2015 문법에 따르면 객체 리터럴의 속성 은 다음 네 가지 중 하나만 될 수 있습니다.

PropertyDefinition :

  • IdentifierReference
  • PropertyName : 할당 표현
  • MethodDefinition

선행을 허용하는 유일한 유형 getMethodDefinition입니다 .

MethodDefinition :

  • PropertyName ( StrictFormalParameters ) { FunctionBody }
  • GeneratorMethod
  • get PropertyName ( ) { FunctionBody }
  • set PropertyName ( PropertySetParameterList ) { FunctionBody }

보시다시피, get양식 은 형식이어야하는 매우 제한된 문법을 따릅니다.

get NAME () { BODY }

문법은 형식의 기능을 허용하지 않습니다 get NAME = ....


도움을 주셔서 감사합니다. 답변을 수락합니다. 할당과 함께 getter / setter를 사용할 수 없다고 정의 된 위치를 알고 있습니까? 그냥 궁금해.
Gabor Dolla

@GaborDolla ECMAScript 사양에서 객체 리터럴 문법을 참조하도록 편집되었습니다.
apsillers

38

받아 들여지는 대답은 훌륭합니다. 압축 된 "화살표 함수 구문" 대신 일반 함수 구문 을 사용하려는 경우 가장 좋습니다 .

하지만 화살표 기능을 정말 좋아할 수도 있습니다. 일반 함수 구문으로 대체 할 수없는 다른 이유로 화살표 함수를 사용할 수 있습니다 . 다른 솔루션이 필요할 수 있습니다.

예를 들어, OP가를 사용하는 것을 알았습니다 . 어휘 적this 으로 바인딩this 할 수 있습니다 . 일명 "non-binding of this" ), 화살표 함수는 어휘 바인딩에 좋습니다.

Object.defineProperty기술을 통해 getter와 함께 화살표 함수를 계속 사용할 수 있습니다 .

{
  ...
  Object.defineProperty(your_obj, 'status', { 
     get : () => this.xhr.status 
  });
  ...
}

관련 항목의 언급 object initialization기술 (일명 get NAME() {...}) 은 VS defineProperty기술 (일명 get : ()=>{}) . 최소한 하나의 중요한 차이가 있습니다. 사용 defineProperty하려면 변수가 이미 있어야합니다.

기존 객체에 게터 정의

즉, (내 예에서) 존재하고 변수에 저장되어 Object.defineProperty있는지 확인해야합니다 your_obj(반면에 object-initialization객체 초기화에서 객체 리터럴을 반환 할 수 있습니다 :) {..., get(){ }, ... }. 자세한 Object.defineProperty내용은 여기

Object.defineProperty(...)get NAME(){...}구문 과 비슷한 브라우저 지원이있는 것 같습니다 . 최신 브라우저, IE 9.


10
영리하지만 궁극적으로 단순한 것보다 훨씬 더 장황합니다.get status() { return this.xhr.status; }
devuxer

2
@devuxer 너무 장황하다는 데 동의합니다. 그러나 명확하게하기 위해서, 당신 this 당신 get status() { ... }이 정의 된 대상 이어야합니다 . 그러나 내가 this 할 수 오른쪽으로 인해 어휘 바인딩 차이로 다른 뭔가?
The Red Pea

2
동의합니다 ... 실제로 this는 get 접근 자에서 내가 원하는 것이 아닌 경우에 부딪히지 않았습니다. ( this화살표 함수 의 바인딩 이점은 이벤트 핸들러 및 콜백과 같이 함수를 전달할 때 작용하는 것 같습니다.)
devuxer

3
내가 자주 지방 화살표 + 어휘 바인딩을 사용 동의 ()=>{}난에 전달하는 콜백에 대한 약속 등을 $http(...).then((promise_result)=> this...})). 뚱뚱한 화살표를 사용하지 않으면 this전역 Window개체를 나타냅니다 . 별로 유용하지 않습니다. 그러나 나는 ()=>{}"접근 자 가져 오기"의 함수로 거의 사용하지 않았습니다. 적어도 thisinside 는 정의 된 get()객체를 나타냅니다 get()(이미 더 유용 Window하므로 사용할 필요가 없습니다). 지방 화살표 기능)!
레드 완두콩

1
defineProperty접근 방식은 루프에서 유용합니다. 지금은 그것을 포함하는 개체에서 칠드 개체의 일부 속성을 노출하는 데 사용했습니다.
Edurne Pascual
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.