함수와 프로토타입 체이닝

Vegonia·2021년 6월 7일
1

함수

  • 함수는 일반 객체처럼 값으로 취급됨(일급객체)

  • 함수 선언문으로 정의된 함수는 엔진에서 이렇게 작동한다!!

var add = function add(x, y) {
return x + y;
}

함수 표현식의 형태로 변경된다

  • 함수 호이스팅
    결론 함수 표현식으로 작성을 하자
    호이스팅이란? 함수가 위치한 코드에 상관없이 실행이 된다
    실행 컨텍스트의 개념을 알아야한다
    그게 뭔데?? 실행을 하기위한 변수객체 생성 -> 실행

  • 함수도 객체다
    그말은 즉, 객체처럼 프로퍼티들을 가질 수 있다
    어떤 프로퍼티?? [[code]] (내부프로퍼티란 것임) result, status


ECMA5 스크립트 명세서에서는 모든 함수가 빨간줄 프로퍼티를 가져야 한다고 기술한다

클로저 내용인데 가능한 이유는 스코프체인때문임

함수 호출 패턴과 this 바인딩

함수를 호출할때 매개변수로 전달되는 인자값에 더해, arguments객체와
this인자가 전달된다

  • 객체의 메서드 호출할때 this 바인딩
    해당 메서드를 호출한 객체로 바인딩된다
    왜?? 참조객체이므로 익명함수를 참조하기 때문이다

  • 함수를 호출할 때 this 바인딩
    전역 객체에 바인딩 된다 window( node는 global )
    그럼 내부 함수를 호출했을때에는???
    그~대~로 적용이된다!!
    왜?? JS에서 따로 내부 함수 호출 패턴을 정의해 놓지 않기 때문
    그럼 어떻게 내가 생각한대로 구현할수있음?? 다른 변수에 저장하셈..
    this는 객체를 가리키므로 이렇게 된다

  • 생성자 함수를 호출할때 this 바인딩

    Person() 함수가 생성자로 호출될때!
    코드가 실행되기 전에 빈객체 생성
    -> 이 빈객체는 Person.prototype 객체를 [[prototype]]링크로 연결하여 자신의 프로토타입으로 설정한다
    -> 이객체는 this로 바인딩된다

  • 함수 리턴
    "자바스크립트 함수는 항상 리턴값을 반환한다"
    그럼 일반함수나 메서드에 지정해주지않을때는?? undefined값이 리턴된다!

생성자 함수에서는요?? 생성된객체(인스턴스)가 리턴된다

프로토타입 체이닝

JS는 프로토타입 기반의 객체지향 프로그래밍을 지원한다
모든객체는 자신의. 부모인. 프로토타입. 객체를 가리키는 참조링크형태의 숨겨진 프로퍼티가있다!
그것이 바로 프로토타입링크이다[[Prototype]]

즉, 생성자함수는 prototype 프로퍼티로 자신과 링크된 프로토타입 객체를 가리킨다
인스턴스들도 이 프로토타입 객체를 숨겨진 링크로 가리키고있다

그럼 체이닝이란? 해당객체의 프로퍼티나 메서드를 접근하려고할때 없으면, [[Prototype]]링크를 따라 부모역할을하는 프로토타입객체를 검색하는것이다!!

즉, 객체의 프로퍼티 읽기나 메서드를 실행할 때만 프로토타입 체이닝이 동작한다
왜?? JS는 객체에 없는 프로퍼티에 값을 쓰려고 할때는 동적으로 추가하기 때문이다!

profile
For Peace

0개의 댓글