ES6 학습 노트 11 Reflect

6339 단어

Reflect 객체 설계 목적


(1) Object 대상의 언어 내부에 뚜렷하게 속하는 방법(예를 들어 Object.defineProperty)을 Reflect 대상에 놓는다.
(2) 일부 Object 메서드를 수정하여 결과를 반환합니다.예를 들어 Object.defineProperty(obj, name, desc) 속성을 정의할 수 없을 때 오류가 발생하고 Reflect.defineProperty(obj, name, desc)는false로 돌아갑니다.
(3) Object 작업을 함수 비헤이비어로 만듭니다.예를 들어 원래key in objdelete obj[key], Reflect.hasProperty(obj,key)Reflect.deleteProperty(obj,key)를 함수로 바꾸다
(4) Reflect 대상의 방법은 Proxy 대상의 방법과 일일이 대응하고 Proxy 대상의 방법이라면 Reflect 대상에서 대응하는 방법을 찾을 수 있다.Proxy가 기본 행동을 어떻게 수정하든지 간에, Reflect에서 기본 행동을 가져올 수 있습니다.
Proxy(target, {
  set: function(target, name, value, receiver) {
    var success = Reflect.set(target,name, value, receiver);
    if (success) {
      log('property ' + name + ' on ' + target + ' set to ' + value);
    }
    return success;
  }
});

상기 코드는 대상의 속성 설정 조작을 차단하였으나, 내부에서 기본 속성 복사 행위를 호출하였다

정적 방법


Reflect 객체의 대부분 메서드는 Object 객체와 동일한 메서드 역할을 하며 Proxy 객체 메서드와 일치합니다.
  • Reflect.apply(target, thisArg, args): 이 방법은function과 같다.prototype.apply.call(func, thisArg, args)
  • function.prototype.apply.call(func, thisArg, args);
    //  
    (FuncApply).call(func,thisArg,args);
    //  
    func.FuncApply(thisArg,args);
    //  
    func.applythisArgargs);
    //  
    thisArgs.func(args);
    //  func.applythisArgargs) , apply 
  • Reflect.construct(target, args): 이 방법은 new target(...args)
  • 과 동일
  • Reflect.get(target, name, receiver): target 대상의name 속성을 찾고 되돌려줍니다. 함수에서this귀속receiver 인자
  • //this  receiver 
    var myObject = {
      foo: 1,
      bar: 2,
      get baz() {
        return this.foo + this.bar;
      },
    };
    
    var myReceiverObject = {
      foo: 4,
      bar: 4,
    };
    
    Reflect.get(myObject, 'baz', myReceiverObject) // 8
  • Reflect.set(target, name, value, receiver): target 대상의name 속성 값을value로 설정하고 함수에서this가receiver 파라미터를 연결하면 이 방법의 호출은Proxy를 촉발합니다.defineProperty 차단
  • Reflect.defineProperty(target, name, desc): Object와 같습니다.defineProperty, 첫 번째 파라미터가 대상이 아니면 오류
  • Reflect.deleteProperty(target, name): delete obj[name]와 같이 대상 속성을 삭제하고true
  • 로 되돌아오기 성공
  • Reflect.has(target, name): 키 in obj에 대응하는 in 연산자, 첫 번째 파라미터가 대상이 아니면 오류 보고
  • Reflect.ownKeys(target): Object와 같은 객체 자체의 모든 속성을 반환합니다.getOwnPropertyNames 및 Object.getOwnPropertySymbols의 합
  • Reflect.isExtensible(target): Object에 해당.isExtensible (target), 첫 번째 파라미터가 대상이 아니면 오류
  • Reflect.preventExtensions(target): Object에 해당.preventExtensions (target), 대상을 확장할 수 없습니다. 파라미터가 대상이 아니라면 오류
  • Reflect.getOwnPropertyDescriptor(target, name): Object와 같습니다.getOwnPropertyDescriptor, 첫 번째 파라미터가 대상이 아니면 오류
  • Reflect.getPrototypeOf(target): 읽기 대상의 원형 대상.Object.getPrototypeOf(target)의 차이점은 파라미터가 대상이 아니라면 후자는 먼저 대상으로 전환되고 전자는 오류
  • Reflect.setPrototypeOf(target, prototype): 설정 대상의 원형 대상.만약 첫 번째 파라미터가 대상이 아니거나null,undefined라면 직접 오류 보고
  • 인스턴스는 Proxy를 사용하여 관찰자 모드를 구현합니다.
    const person = observable({
      name: ' ',
      age: 20
    });
    
    function print() {
      console.log(`${person.name}, ${person.age}`)
    }
    
    observe(print);
    person.name = ' ';
    //  
    //  , 20
    const queuedObservers = new Set();
    
    const observe = fn => queuedObservers.add(fn);
    const observable = obj => new Proxy(obj, {set});
    
    function set(target, key, value, receiver) {
      const result = Reflect.set(target, key, value, receiver);
      queuedObservers.forEach(observer => observer());
      return result;
    }

    상기 코드는 모든 관찰자 함수를 집합에 넣은 다음에 대상의 속성 부여 조작을 차단하고 속성이 바뀌면 모든 관찰자 함수를 자동으로 실행한다

    좋은 웹페이지 즐겨찾기