ES6 객체의 방법 : 화살표 기능 사용


97

ES6에서는 두 가지 모두 합법적입니다.

var chopper = {
    owner: 'Zed',
    getOwner: function() { return this.owner; }
};

그리고 속기 :

var chopper = {
    owner: 'Zed',
    getOwner() { return this.owner; }
}

새로운 화살표 기능도 사용할 수 있습니까? 같은 시도에서

var chopper = {
    owner: 'John',
    getOwner: () => { return this.owner; }
};

또는

var chopper = {
    owner: 'John',
    getOwner: () => (this.owner)
};

메서드에에 대한 액세스 권한이 없다는 오류 메시지가 표시됩니다 this. 이것은 단지 구문 문제입니까, 아니면 ES6 객체 내에서 fat-pipe 메서드를 사용할 수 없습니까?


11
새로운 함수 구문의 가장 큰 포인트 중 하나는 this다르게 취급된다는 것 입니다. 함수가 생성 된 어휘 환경에 의해 정의되며 변수 this를 생성 chopperthis값이 함수 의 값이됩니다. 즉, chopper객체를 참조하지 않습니다 .

1
뚱뚱한 화살표 구문을 사용하는 동안? this먼저 chopper객체를 생성 하여 값 을 변경 한 다음 this해당 객체를 가리키는 함수에서 할당을 수행하는 경우에만 해당됩니다 . 이것은 생성자 함수를 사용하여 매우 깔끔하게 수행 할 수 있습니다.

1
이 데모는 Firefox에서 실행됩니다. Chrome에는 아직 없습니다. jsfiddle.net/bfyarxfe

2
@fox, 해당 jsfiddle에서 '엄격한 사용'을 사용해야합니다.
Walter Chapilliquen-wZVanG 2015 년

1
@fox : 지원되는 환경에서 잘 작동합니다. Firefox는 아직 완전한 지원이 없습니다. Continuumconsole.log()메서드 호출 결과 에서 시도해보십시오 . 효과가있다.

답변:


156

Arrow 함수는 모든 상황에서 단순히 구식 함수의 짧은 버전으로 사용되도록 설계되지 않았습니다. function키워드를 사용하는 함수 구문을 대체하기위한 것이 아닙니다 . 화살표 함수의 가장 일반적인 사용 사례는 재정의하지 않는 짧은 '람다'로 this, 함수를 일부 함수에 대한 콜백으로 전달할 때 자주 사용됩니다.

화살표 함수는 this어휘 적으로 둘러싸는 컨텍스트에서 닫히기 때문에 화살표 함수를 사용하여 개체 메서드를 작성할 수 없습니다 this. 즉,

// Whatever `this` is here...
var chopper = {
    owner: 'Zed',
    getOwner: () => {
        return this.owner;    // ...is what `this` is here.
    }
};

귀하의 경우 객체에 대한 메소드를 작성하려면 기존 function구문 또는 ES6에 도입 된 메소드 구문을 사용해야 합니다.

var chopper = {
    owner: 'Zed',
    getOwner: function() {
        return this.owner;
    }
};

// or

var chopper = {
    owner: 'Zed',
    getOwner() {
        return this.owner;
    }
};

(그들 사이에는 작은 차이가 있지만 super에서 사용 getOwner하거나 사용하지 않는 경우 또는 getOwner다른 개체에 복사 하는 경우 에만 중요 합니다.)

es6 메일 링리스트에서 유사한 구문을 가지고 있지만 그들 자신을 가진 화살표 함수에 대한 트위스트에 대한 논쟁이있었습니다 this. 그러나이 제안은 단순한 구문 설탕이기 때문에 사람들이 몇 개의 문자를 입력하는 것을 절약 할 수 있고 기존 함수 구문보다 새로운 기능을 제공하지 않기 때문에 제대로 받아 들여지지 않았습니다. 바인딩 해제 된 화살표 기능 항목을 참조하십시오 .


이 글을 올바르게 읽고 있다면 메일 링리스트가 코드의 통일성 / 가독성을 높이더라도 문법적 설탕의 우선 순위를 낮춘다는 것을 암시하는 것 같습니다. 현재로서는 coffeescript에서보다 ES6에서 OOP 컨텍스트에서 fat-arrow 함수를 사용하는 것이 훨씬 더 어렵습니다.
fox

내가 이해하는 바와 같이, 문법적 설탕 언어 확장을 고려하는 타당한 이유로 간주되지만 우선 순위가 낮다고 말했듯이 그러한 제안에 대한 기준은 더 높습니다.

12

이 줄 getOwner: => (this.owner)은 다음과 같아야합니다.

var chopper = {
    owner: 'John',
    getOwner: () => this.owner
}; //here `this` refers to `window` object.

this함수 로 선언해야 합니다.

var chopper = {
    owner: 'John',
    getOwner() { return this.owner }
};

또는:

var chopperFn = function(){

    this.setOwner = (name) => this.owner = name;
    Object.assign(this,{
        owner: 'Jhon',
        getOwner: () => this.owner,
    })

}

var chopper = new chopperFn();
console.log(chopper.getOwner());
chopper.setOwner('Spiderman');
console.log(chopper.getOwner());


1
여기에 오류가 받고 있어요 :"TypeError: Cannot read property 'owner' of undefined\n at Object.chopper.getOwner
여우

올바른 사용법이지만 esta 메서드는 항상 창 개체를 반환합니다. this함수 내 에서 선언해야 합니다.
Walter Chapilliquen-wZVanG 2015 년

2
this반드시를 참조하는 것은 아닙니다 window. 주변 this환경에있는 의 현재 값이 무엇이든 참조 합니다 window. 아마도 그게 당신이 의미 한 바일 것입니다. 그가 기본값이 아님을 이해하고 있는지 확인하고 싶습니다.

@torazaburo 즉, 내가 그것을 시도, 나를 위해 괜찮 this이제 클래스를 의미
wZVanG - 월터 Chapilliquen

2
당신이 쓴 내용은 단순히 쓰는 것보다 더 장황 var chopperFn = function() { this.owner = 'Jhon'; this.getOwner = () => this.owner; }합니다.

1

화살표 기능을 사용하기 위해 따르는 간단한 팁입니다.

  • object.method()구문을 사용할 메서드에는 화살표가 아닌 함수를 사용하십시오 . ( this이는 호출자로부터 의미있는 값을 받을 함수입니다 .)
  • 거의 모든 것에 화살표 기능을 사용하십시오.


0

당신이 사용 화살표 기능이있는 경우, 당신은 변경할 수 있습니다 thischopper,

var chopper = {
  owner: "John",
  getOwner: () => chopper.owner
};

이것이 모범 사례는 아니지만 개체 이름을 변경할 때이 화살표 기능을 변경해야합니다.


0

엄격 모드의 또 다른 팁 this은 여전히 ​​정의되지 않은 대신 창을 참조합니다.

  (() => {
    "use strict";
    console.log(this); // window
  })();

  (function () {
    "use strict";
    console.log(this); // undefined
  })();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.