JavaScriptログクラス(2)

2830 ワード

組み込みクラスの展開


組み込みクラスは静的メソッドを継承できません.

「instancef」を使用してクラスをチェックする


instanceof演算子を使用して、オブジェクトがクラスに属しているかどうかを決定します.instanceofは継承関係もチェックします.
class Rabit{}

let rabbit = new Rabbit();

alert(rabbit instanceof Rabbit);

かき混ぜる


JavaScriptは、単一の継承のみを許可する言語です.オブジェクトには[prototype]が1つしかなく、クラスには1つのクラスしか継承できません.
混入(mixin)は、他のクラスを継承する必要がなく、これらのクラスに実装されるメソッドに含まれるクラスとして定義される.
// 믹스인
let sayHiMixin = {
  sayHi() {
    alert(`Hello ${this.name}`);
  },
  sayBye() {
    alert(`Bye ${this.name}`);
  }
};

// 사용법:
class User {
  constructor(name) {
    this.name = name;
  }
}

// 메서드 복사,  객체 병합
Object.assign(User.prototype, sayHiMixin);

// 이제 User가 인사를 할 수 있습니다.
new User("Dude").sayHi(); // Hello Dude!
let eventMixin = {
  /**
   *  이벤트 구독
   *  사용패턴: menu.on('select', function(item) { ... }
  */
  on(eventName, handler) {
    if (!this._eventHandlers) this._eventHandlers = {};
    if (!this._eventHandlers[eventName]) {
      this._eventHandlers[eventName] = [];
    }
    this._eventHandlers[eventName].push(handler); //Optional chaning operator, 객체가 undefined 또는 null일 때 연산의 결과 대신 undefined를 반환한다.
  },

  /**
   *  구독 취소
   *  사용패턴: menu.off('select', handler)
   */
  off(eventName, handler) {
    let handlers = this._eventHandlers?.[eventName];
    if (!handlers) return;
    for (let i = 0; i < handlers.length; i++) {
      if (handlers[i] === handler) {
        handlers.splice(i--, 1); //배열의 기존요소 삭제 및 변경
      }
    }
  },

  /**
   *  주어진 이름과 데이터를 기반으로 이벤트 생성
   *  사용패턴: this.trigger('select', data1, data2);
   */
  trigger(eventName, ...args) {
    if (!this._eventHandlers?.[eventName]) {
      return; // no handlers for that event name
    }

    // 핸들러 호출
    this._eventHandlers[eventName].forEach(handler => handler.apply(this, args));
  }
};
// 클래스 생성
class Menu {
  choose(value) {
    this.trigger("select", value);
  }
}
// 이벤트 관련 메서드가 구현된 믹스인 추가
Object.assign(Menu.prototype, eventMixin);

let menu = new Menu();

// 메뉴 항목을 선택할 때 호출될 핸들러 추가
menu.on("select", value => alert(`선택된 값: ${value}`));

// 이벤트가 트리거 되면 핸들러가 실행되어 얼럿창이 뜸
// 얼럿창 메시지: Value selected: 123
menu.choose("123");
プロトタイプ+について

prototype property=>プロトタイプオブジェクトの作成者関数=>オブジェクト
新しいオブジェクトのproto=>プロトタイプオブジェクト
プロトタイプとは、新しいオブジェクトを作成するときにそのプロトタイプになるオブジェクトです.
ソース:https://velog.io/@h0ngwon/Javascript-proto-vs-prototype-%EC%B0%A8%EC%9D%B4