[Javasript log] 클래스 (2)
내장 클래스 확장하기
내장클래스는 정적 메서드를 상속받지 못한다.
'instancef'로 클래스 확인하기
instanceof 연산자를 사용하면 객체가 특정 클래스에 속하는지 아닌지를 확인할 수 있다. instanceof는 상속 관계도 확인해준다.
class Rabit{}
let rabbit = new Rabbit();
alert(rabbit instanceof Rabbit);
믹스인
자바스크립트는 단일상속만을 허용하는 언어다. 객체엔 단 하나의 [[Prototype]]만 있을 수 있고, 클래스는 클래스 하나만 상속받을 수 있다.
믹스인(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 프로퍼티 => 프로토타입객체의 생성자함수 => 객체
새객체의 proto => 프로토타입 객체
프로토타입이란 새 객체가 만들어졌을때 그 원형이 되는 객체
출처 : https://velog.io/@h0ngwon/Javascript-proto-vs-prototype-%EC%B0%A8%EC%9D%B4
Author And Source
이 문제에 관하여([Javasript log] 클래스 (2)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@soyernssi/Javasript-log-클래스-2저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)