HTML과 CSS/JavaScript

JavaScript - 호이스팅, 화살표 함수, 객체, 프로퍼티, 상속, 프로토타입

큐트아리 2023. 11. 3. 15:33

1. 호이스팅(hoisting)

- 자바스크립트의 인터프리터가 변수와 함수의 메모리 공간을 선언 전에 미리 할당하는 것을 의미
- 자바스크립트의 인터프리터가 돌리기전에 한번 훑고 미리 올려넣을 거 올려넣은 다음에 코드실행하는 것을 의미
- var로 선언한 변수의 경우 호이스팅 시 undefiend로 변수를 초기화
- let과 const로 선업한 변수의 경우 호이스팅시 변수를 초기화하지 않음

 

1.1. 호이스팅 예시 - 선언형

func1() //  호이스팅이 실행전에 미리 함수를 메모리에 올려놓기때문에 이렇게 선언전에 먼저 사용해도 됨
function func1(){
    ....
}
인터프리팅 결과 (함수호이스팅)
function func1(){} 
func1()
이 순서로 작성한 것과 동일

1.2. 호이스팅 예시 - 표현형

func2() // 이런 애들은 호이스팅이 되지 않기때문에 선언전에 사용하면 에러가 남
let func2 = function(){
    ....
}

인터프리팅 결과 (변수 호이스팅) 호이스팅해도 변수만 선언되지 그 안의 function은 호이스팅 되지않음
let func2()
func2()
function func2(){}

 

2. 화살표 함수

- function 키워드를 사용하여 함수를 만드는 것보다 간단하게 표현
- 화살표 함수는 항상 익명으로 만들어짐(1회성 사용 혹은 변수에 저장)
- 당연히 호이스팅 불가!!

 

2.1. 매개변수가 없을 경우

    const 상수 = () => {
        함수가 호출되었을때 실행할 문장 ,{}는 한줄일경우 생략가능
        }
        1.1 한 줄일 경우
          const 상수 = () => 함수가 호출되었을때 실행할 문장

2.2. 매개변수가 여러개일 경우

    const 상수 = (매개변수1, 매개변수2, ..) => {
        함수가 호출되었을때 실행할 문장 ,{}는 한줄일경우 생략가능
        }
        2.1 한 줄일 경우
          const 상수 = (매개변수1, 매개변수2, ..) => 함수가 호출되었을때 실행할 문장

2.3. 매개변수가 1개인 경우 (소괄호 생략경우)

        const 상수 = 매개변수1 => { 
        함수가 호출되었을때 실행할 문장 ,{}는 한줄일경우 생략가능
        }
        3.1. 한 줄일 경우 
        const 상수 = 매개변수=> 함수가 호출되었을때 실행할 문장

 

3. 객체(Object)

- 하나의 주제를 가지고 관련있는 프로퍼티(property= 필드, 메소드 등등)를 가지고 있는 집합

 

4. 프로퍼티(property)

- 이름과 값으로 구성된 정렬되지 않은 집합
- 프로퍼티는 함수도 저장할 수 있음 -> 프로퍼티 메소드

 

5. 객체생성 방법 3가지

5.1. 리터럴 표기법(직접 대입하는 표기법, 재사용 불가능)

    const 객체명 = {
        프로퍼티명1:값1,
        프로퍼티명2:값2
        .....

        프로퍼티명n:function(){ // 메서드 생성
            프로퍼티가 호출되면 실행할 문장
        }
    }

5.2. 생성자를 이용하는 객체를 만드는 방법 (재사용가능)

- 생성자 : 객체를 만드는 함수

    function 생성자명(매개변수1, 매개변수2, ..){
        this.프로퍼티명1 = 값1; 
        this.프로퍼티명2 = 값2;
        this.프로퍼티명n:function(){ // 메서드 생성
            프로퍼티가 호출되면 실행할 문장
        }
    }

    const 객체명1 = new 생성자명(값1, 값2, ..);
    const 객체명1 = new 생성자명(값1, 값2, ..);

※ 생성자를 이용하여 객체를 만드는 것의 특징

    - new 연산자를 사용하여 객체를 생성하고 초기화 가능
    - 새롭게 생성되는 객체를 초기화하는 역할
    - 같은 형태의 객체를 여러개 생성할 때 유리

5.3. 클래스 이용(클래스 이용해도 결국에서는 생성자로 바뀜)

- ECMA script6에 추가된 객체 생성 방법
- 내부적으로 생성자를 이용한 객체 생성 방법과 동일하게 작동

    const 클래스명 = class {
        constructor(매개변수1,매개변수2,..){
            this.프로퍼티명1 = 값1
            this.프로퍼티명2 = 값2;
            ...
        }
        메소드명(매개변수1,매개변수2){
            메소드가 호출되면 실행할 문장
        }
    }

    const 객체명1 = new 클래스명(값1, 값2, ..)
    const 객체명2 = new 클래스명(값1, 값2, ..)

 

6. 상속

- 클래스 기반의 객체지향 언어와는 다름
- 자바스크립트는 프로토타입 기반의 객체지향 언어

 

7. 프로토타입(prototype)

- 모든 객체는 프로토타입이라는 객체를 가지고 있음
- 모든 객체는 프로토타입으로 부터 프로퍼티와 프로파티 메소드를 상속받음
- 모든 객체는 최소한 하나이상의 다른 객체로부터 상속을 받으며 상속되는 정보를 제공하는 미리 만들어진 형태를 프로토타입이라고 함

const PPomi() - new Dog() // Dog.prototype 생성 -> PPomi에 Dog.prototype와 Object.prototype(기본적프로토타입) 상속
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>프로토타입</title>
</head>
<body>
    <h2>프로토타입</h2>
    <script>
        function Dog(color,name, age){
            this.color = color
            this.name = name
            this.age = age
        }

        const Rucy = new Dog('white','Rucy',14)
        console.log(`이름: ${Rucy.name}`)
        console.log(`색상: ${Rucy.color}`)
        console.log(`나이: ${Rucy.age}`)
        Rucy.family = '포메라니안'
        Rucy.getFamily = function(){
            return this.family
        }
        console.log(`종: ${Rucy.family}`)
        console.log(`getFamily: ${Rucy.getFamily()}`)
        console.log('--------------------------')
        const PPomi = new Dog('white','PPomi',6)
        console.log(`이름: ${PPomi.name}`)
        console.log(`색상: ${PPomi.color}`)
        console.log(`나이: ${PPomi.age}`) 
        // 뽀미에겐 추가하지 않았으니 에러남
        // console.log(`종: ${PPomi.family}`)
        // console.log(`getFamily: ${PPomi.getFamily()}`)

        // 생성자 프로토타입(상속해주는 프로토타입)에 프로퍼티와 프로퍼티메서드 추가
        Dog.prototype.owner = '김사과'
        Dog.prototype.run = function(){
            return this.name + '달립니다.'
        }

        // 프로토타입의 객체가 달라졌으니 모두 적용된다 호이스팅이 되어 적용됨으로 나중에 추가한애가 먼저 코드가 작성된 애인 rucy와 ppomi에게 영향을 준다
        console.log(`소유자 :  ${Rucy.owner}`)
        console.log(`run :  ${Rucy.run()}`)
        console.log(`소유자 :  ${PPomi.owner}`)
        console.log(`run :  ${PPomi.run()}`)

        
    </script>
</body>
</html>