March 2, 2021 • ☕️☕️ 8 min read
우테코 Lv1 lotto 학습로그
클래스의 인스턴스를 new 키워드로 생성하면, 객체의 생성 방법을 사용자측에서 너무 자세히 알아야 하는 문제가 있다. 객체를 생성하는 정적 메서드를 제공해주고 이 메서드를 사용하게끔 하여 문제를 해결할 수 있다.
👾 객체 생성을 캡슐화하는 기법
객체 생성의 역할을 하는 클래스 메서드 (static
)
생성자 대신 정적 팩토리 메서드를 사용할 수 없는지 생각해보기
class Lotto = {
constructor() {
// ...
}
static newLotto() {
return new Lotto(generateRandomNumbers());
}
}
// bad
const lotto = new Lotto(generateRandomNumbers());
// good
const lotto = Lotto.newLotto();
링크
class
대신 id
(단일 엘리먼트), dataset
(여러 개) 사용하기class
로 선택하는 경우 기능과 상관없이 스타일이 바뀌었을 때 일일이 찾아 수정해주어야 하는 번거로움이 있으며, 이는 프로그램이 깨지기 쉬운 취약한 구조이다.
문서에 한 개뿐인 단일 요소이면 id
를, 특정한 데이터 속성을 가지고 있다면 dataset
을 사용하자. 또, dataset
은 id
와 class
를 사용하기 적절하지 않은 상황에서만 사용하는 것이 좋다.
#
JavaScript의 private class field를 나타내는 해쉬(#
)는 ES2019에서 추가된 문법이다. #
prefix를 추가해 private class field를 선언할 수 있다.
class ClassWithPrivateField {
#privateField;
}
class ClassWithPrivateMethod {
#privateMethod() {
return "hello world";
}
}
class ClassWithPrivateStaticField {
static #PRIVATE_STATIC_FIELD;
}
private class field는 class 선언문 내부의 class 생성자에서 접근이 가능하다.
링크 https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Classes/Private_class_fields
외부에서 사용 시 method chaining을 위해 class method 구현부에서 return this
를 사용할 수 있다.
export default class View {
constructor() { ... }
show() {
// ...
return this;
}
hide() {
// ...
return this;
}
class SomeView extends View { ... }
const someView = new SomeView();
someView.show().hide(); // chaining
링크 https://mingcoder.me/2020/07/19/Programming/JavaScript/inheritance-vs-composition/
이벤트의 이름과 전달 데이터를 명시하여 이벤트를 사용자화할 수 있다.
obj.addEventListener("go", function (e) {
console.log(e + "going");
});
const event = new CustomEvent("go", { detail: "zig" });
obj.dispatchEvent(event);
링크 https://developer.mozilla.org/ko/docs/Web/API/CustomEvent/CustomEvent
role
과 aria-*
속성을 사용한다.label의 텍스트를 표시하지 않을 경우 사용한다. 태그의 목적을 설명한다.
<input
type="number"
class="winning-number mx-1 text-center"
aria-label="winning-number-1"
/>
aria-labelledby
가 우선순위가 더 높다
링크 https://developer.mozilla.org/ko/docs/Web/Accessibility/ARIA
하나의 프로젝트에서 util은 특정 도메인은 알지 못하고 범용적으로 사용할 수 있는 것들의 모음이다. 특정 도메인에 국한되지 않도록 작성할 수 있어야 한다.
change
- input 요소의 값이 바뀌었을 때 발생. 포커스를 잃거나, 엔터를 입력하는 등의 경우에 발생한다.input
- input 요소의 value 속성이 바뀔 때마다 발생객체 프로그래밍은 각 객체별로 역할을 나누고 객체에게 인자 처리를 요청하는 흐름으로 이루어진다.
필요한 데이터를 추상화시켜 상태와 행위르 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 것이다.
링크 https://jeong-pro.tistory.com/95
링크
const lottoTickets = Array.from(
{ length: this.count },
(_, idx) => `<li>....</li>`
).join("");
Array.from()
메서드는 유사 배열 객체(array-like object)나 반복 가능한 객체(iterable object)를 얕게 복사해 새로운 Array 객체를 만든다.
링크 https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/from
nextElementSibling
선택한 요소의 바로 다음 요소를 리턴한다.
링크 https://developer.mozilla.org/en-US/docs/Web/API/Element/nextElementSibling
const inputs = document.getElementById("my-form").elements;
const inputByIndex = inputs[0];
const inputByName = inputs["username"];
링크 https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/elements