🚨 동일한 로직을 반복해서 사용해야 한다면?
ㄴ 리터럴방식과 생성자함수
*리터럴 방식 Literal : 객체 데이터{ }, 문자 데이터' ', 배열 데이터[ ] 등 객체 지향 언어에서 데이터를 표현하는 방식에 사용된다.
예로 string이라는 전역 객체(자바스크립트 전체영역에서 사용가능한 객체)는 문자열(문자의 나열)의 생성자이다. 생성자는 new String()으로 사용될 수 있음을 의미한다. 그러나 string은 리터럴 방식의 따옴표 안('데이터')에 표현하기도 한다.
📍 복붙하는 것이 쉬워보이니까 그냥 복붙하면 되지
하지만 개발자는 메모리 누수를 잘 관리해서 효율적인 코드를 짜야 한다.
👩💻 아래와 같이 siot이라는 변수에 getFullName메소드를 실행한다고 해보자.
const siot = {
firstName : 'siot',
lastName : 'kim',
getFullName : function () {
return `${this.firstName} ${this.lastName}`
}
}
console.log(siot.getFullName()) // siot kim
이번에는 추가로 amy라는 변수를 만들어 똑같이 getFullName을 실행하고 싶다. siot변수와 마찬가지로 동일한 로직을 amy변수에 복붙하면 된다. 그러나 siot과 amy는 동일한 구조의 로직을 가지므로 이는 매우 비효율적이다.
const amy = {
firstName : 'amy',
lastName : 'clarks',
getFullName : function () {
return `${this.firstName} ${this.lastName}`
}
}
console.log(amy.getFullName()) // amy clarks
📍 생성자 함수를 사용해서 참조하면 어떨까?
생성자 함수는 일반 함수와 구분이 되지 않기 때문에 관행적으로 파스칼 표기법 PascalCase을 사용한다.
*PascalCase : 첫번째 문자를 대문자로 표기하는 방법
👩💻 new연산자와 함께 user라는 이름의 생성자함수를 호출했다.
생성자함수에 의해 생성된 객체 데이터siot은 생성자함수의 인스턴스instance라 한다.
const siot = new User('siot', 'kim')
👩💻 생성자 함수의 prototype을 이용해 class를 만들어 보자.
user함수는 first와 last를 매개변수로 가지고 있고 firstName과 lastName속성으로 정의했다.
이 부분은 매개변수에 들어오는 데이터에 따라 값이 매번 달라지므로 아래와 같이 사용할 수 있다.
getFullName은 변경될 일이 없으므로 다음과 같이 사용한다.
이 user함수의 숨겨진 prototype속성에 getFullName이라는 멤버를 추가해 결과적으로 원하는 기능의 함수를 할당해 반환한다.
siot.getName()과 같이 새로운 변수에도 getName()메서드를 붙여 동일한 로직을 실행할 수 있다. 즉, 앞서 만들어진 로직을 참조한다고 한다.
function User(first, last) {
this.firstName = first
this.lastName = last
}
User.prototype.getFullName = function () {
return `${this.firstName} ${this.lastName}`
}
const siot = new User('siot', 'kim')
console.log(siot.getName())
📍 javascript의 class기능으로 더욱 간편하게
javascript는 prototype기반의 프로그래밍 언어라고도 한다. prototype을 사용해 생성자 함수로 인스턴스를 만들어내는 것을 javascript의 class라고 한다. 하지만 지금까지 위에서 언급한 방법보다 더 간단하게 class를 사용할 수 있다.
class를 사용할 때는 constructor라는 내부함수를 사용한다. 이 내부함수 constructor에 매개변수를 받는다.
prototype이라는 속성을 사용하지도 않아도 getFullName은 자동으로 정의된다.
최종 코드
class User {
constructor(first, last) {
this.firstName = first
this.lastName = last
}
getFulName() {
return `${this.firstName} ${this.lastName}`
}
}
const siot = new User('siot', 'kim')
console.log(siot.getFulName()) // siot kim
💡 클래스의 상속(확장) 개념
특정 클래스를 새로운 클래스에 상속시켜 그대로 사용하거나 내용을 추가할 수 있다.
확장된 클래스를 super키워드로 불러온다.
class Vehicle {
constructor (name, wheel) {
this.name = name
this.wheel = wheel
}
}
class Bicycle extends Vehicle {
constructor (name, wheel) {
super(name, wheel)
}
}
const myBicycle = new Bicycle('자전거', 2)
console.log(myBicycle)
class Car extends Vehicle {
constructor (name, wheel, license) {
super(name, wheel)
this.license = license
}
}
const myCar = new Car ('내차', 4, true)
console.log(myCar)
'FE' 카테고리의 다른 글
JS 데이터 API / String, Number, Math (0) | 2021.11.07 |
---|---|
일반 함수와 화살표 함수가 this를 정의하는 범위 (0) | 2021.11.07 |
타이머 함수 Timeout Interval / 콜백함수 (0) | 2021.11.06 |
호이스팅을 이용해 로직 파악을 빠르게 (0) | 2021.11.06 |
즉시실행함수IIFE 사용방법 (0) | 2021.11.06 |