Iterator, Generator, Proxy

Jiwontwopunch·2022년 6월 16일
0

독학

목록 보기
87/102
post-thumbnail

열거 가능한 객체 정의하기 Iterator

반복자 Iterator는 객체의 내용을 열거하기 위한 구조를 갖춘 객체이다. 예를 들어 Array, String, Map, Set 등의 내장 객체는 모두 디폴트로 반복자를 갖추고 있기 때문에 for...of 명령으로 내부 요소를 열거할 수 있다.

let data_ary=['one','two','three'];
let data_str='가나다라마';
let data_map= new Map([['MON','월요일'],['TUE','화요일'],['WED','수요일']]);

for(let d of data_ary){
  console.log(d); // one, two, three
}

for(let d of data_str){
  console.log(d); // 가,나,다,라,마
}

for(let[key,value]of data_map){
  console.log(`${key}:${value}`); // MON:월요일, TUE:화요일, WED:수요일
}
let data_ary=['one','two','three'];
let itr= data_ary[Symbol.iterator]();
let d;
while(d=itr.next()){
  if(d.done){break;}
  console.log(d.done); // false, false, false
  console.log(d.value); // one, two, three
}

[Symbol.iterator]()메소드는 배열 내의 요소를 열거하기 위한 반복자(Iterator객체)를 반환한다. 반복자는 다음의 요소를 꺼내기 위한 next()메소드를 갖는다. next 메소드의 반환값은 요소의 값 자체가 아니다.

class MyIterator{
  // 인수를 통해 전달된 배열을 data 프로퍼티에 설정
  constructor(data){
    this.data=data;
  }
  
  // 디폴트 반복자를 취득하기 위한 메소드를 정의
  [Symbol.iterator](){
    let current=0;
    let that=this;
    return{
      // data 프로퍼티의 다음 요소를 취득
      next(){
        return current<that.data.length?
          {value: that.data[current++], done: false} :
          {done: true};
      }
    };
  }
}

// MyIterator 클래스에 보관된 배열을 열거
let itr= new MyIterator(['one','two','three']);
for(let val of itr){
  console.log(val); // one, two, three
}

next 메소드 안의 this는 자기 자신(반복자)를 나타낸다. 따라서 [Symbol.iterator] 메소드 안의 this를 일단 변수 that으로 대피시켜둠으로써 MyIterator 객체의 멤버에 엑세스할 수 있도록 하고 있다.

열거 가능한 객체를 더운 간단하게 구현하기 Generator

function* myGenerator(){
  yield '가나다라마';
  yield '바사아자차';
  yield '타카파하갸';
}
for(let t of myGenerator()){
  console.log(t); // 가나다라마, 바사아자차, 타카파하갸
}

객체의 기본적인 동작 사용자 정의 Proxy

let data= {red:'빨간색',yellow:'노란색'};
var proxy= new Proxy(data, {
  get(target, prop){
    return prop in target ? target[prop] : '?';
  }
});
console.log(proxy.red); // 빨간색
console.log(proxy.nothing); // ?

0개의 댓글