자바스크립트는 명령형, 함수형, 프로토타입 기반, 객체지향 프로그래밍을 지원하는 멀티 패러다임 프로그래밍 언어다. 자바스크립트를 이루고 있는것중 원시값을 빼면 다 객체로 이뤄져 있다.
객체의 집합으로 프로그램을 표현하는 프로그래밍 패러다임을 말한다.
실세계의 실체를 인식하는 철학적 사고를 프로그래밍에 접목하려는 시도로 시작되었고 실체는 특징이나 성질을 나타내는 속성을 가지고 인식하거나 구별 할 수 있다.
실체에는 많은 속성이 있지만 그 중에서 원하는 속성만 참조하고 싶을때 필요한 속성만 간추려 표현한것을 추상화라고 한다.
let sum = {
num : 0,
getPlay() {
return this.num += 1
}
}
console.log(sum.num) // 0
console.log(sum.getPlay()) // 1
console.log(sum.num) // 1
sum이란 객체안에 num은 상태를 나타내는 데이터이고 프로퍼티라 한다.
sum.getPlay() 은 num에 1을 더해주는 동작이라 하고 메서드라 한다.
객체 지향 프로그래밍은 객체의 상태를 나타내는 데이터와 상태 데이터를 조작할 수 있는 동작을 하나의 논리적인 단위로 묶은 복합적인 자료구조다.
객체의 프로퍼티 또는 메서드를 다른 객체가 상속 받아 그대로 사용 할 수 있는걸 말한다.
자바스크립트는 프로토타입을 기반으로 상속하여 기존의 코드를 재사용한다.
function Circle(radius){
this.radius = radius
this.getDiameter = function(){
return 2 * this.radius
}
}
const circle1 = new Circle(5)
const circle2 = new Circle(2)
// 생성자 함수를 이용해 동일한 동작하는 getDiameter 메서드를 중복 생성하고 모든 인스턴스가 중복 소유한다.
예제대로면 Circle 생성자 함수가 생성하는 모든 객체는 radius프로퍼티와 getDiameter메서드를 갖는다.
동일한 메서드가 중복 소유되어 메모리를 불필요하게 낭비하게 된다.
프로토타입을 기반으로 상속해서 해결 할 수 있다.
// 생성자 함수
function sum(num){
this.num = num
}
// sum 생성자 함수의 인스턴스가 메서드를 공유해서 사용 할 수 있도록 프로토 타입에 추가됨
// sum 생성자 함수의 prototype 프로퍼티에 바인딩 됨.
// sum의 인스턴스는 부모 객체인 sum.prototype으로부터 메서드를 상속받는다
sum.prototype.getArea = function () {
return this.num + 1
}