생성자 함수 createApplication(3)

김대웅·2021년 6월 23일
0

express 분석

목록 보기
3/14

./lib/express.js

function createApplication() {
  var app = function(req, res, next) {
    // TODO 아직 이해 못함
    app.handle(req, res, next);
  };

  mixin(app, EventEmitter.prototype, false);
  mixin(app, proto, false);

  /**
   *
   * proto에서 app에 복사한 프로퍼티
   *
   * init
   * defaultConfiguration
   * lazyrouter
   * handle
   * use
   * route
   * engine
   * param
   * set
   * path
   * enabled
   * disabled
   * enable
   * disable
   * acl
   * bind
   * checkout
   * connect
   * copy
   * delete
   * get
   * head
   * link
   * lock
   * m-search
   * merge
   * mkactivity
   * mkcalendar
   * mkcol
   * move
   * notify
   * options
   * patch
   * post
   * pri
   * propfind
   * proppatch
   * purge
   * put
   * rebind
   * report
   * search
   * source
   * subscribe
   * trace
   * unbind
   * unlink
   * unlock
   * unsubscribe
   * all
   * del
   * render
   * listen
   */

  // expose the prototype that will get set on requests
  app.request = Object.create(req, {
    app: { configurable: true, enumerable: true, writable: true, value: app }
  })

  // expose the prototype that will get set on responses
  app.response = Object.create(res, {
    app: { configurable: true, enumerable: true, writable: true, value: app }
  })

  /**
   * Object.create() 메서드는 프로토타입 개체 및 속성(property)을 갖는 새 개체를 만든다.
   *
   * https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/create 참고
   */

  /**
   * 첫번째 매개변수 : 새로 만든 개체의 프로토타입이어야 할 객체
   *
   * 두번째 매개변수 : 설정된 경우 새로 만든 개체에 프로퍼티 설명자(property descriptor)를 추가한다 / Object.defineProperties()의 두 번째 인수에 해당
   */

  /**
   * writable: true이면 값을 수정할 수 있다.
   * enumerable: true이면 반복문을 사용해 나열할 수 있다.
   * configurable: true이면 프로퍼티 삭제나 플래그 수정이 가능하다.
   *
   * 위의 프로퍼티들의 기본값은 false이다.
   *
   */

  /**
   * res 개체가 가지고있는 출력가능한 프로퍼티
   *
   * header
   * get
   * accepts
   * acceptsEncodings
   * acceptsEncoding
   * acceptsCharsets
   * acceptsCharset
   * acceptsLanguages
   * acceptsLanguage
   * range
   * param
   * is
   * protocol
   * secure
   * ip
   * ips
   * subdomains
   * path
   * hostname
   * host
   * fresh
   * stale
   * xhr
   *
   * app.request 개체가 가지고있는 출력가능한 프로퍼티
   *
   * app
   *
   */

  /**
   * res 개체가 가지고 있는 출력가능한 프로퍼티
   *
   * status
   * links
   * send
   * json
   * jsonp
   * sendStatus
   * sendFile
   * sendfile
   * download
   * type
   * contentType
   * format
   * attachment
   * append
   * header
   * set
   * get
   * clearCookie
   * cookie
   * location
   * redirect
   * vary
   * render
   *
   * app.response 개체가 가지고있는 출력가능한 프로퍼티
   *
   * app
   *
   */

  /**
   * res와 req개채의 프로퍼티중 app프로퍼티는 존재하지 않음
   *
   * Object.create의 두번쨰 매개변수를 통해 원본 개체에 존재하지 않는 프로퍼티를 추가할수 있는것 같다.
   *
   */

  /**
   * app request 프로퍼티와 response 프로퍼티에 req와 res의 프로토타입 개체 및 속성을 갖는 새 개체를 할당한다.
   * 이때 새로 할당하는 개체의 프로퍼티 app의 경우 { configurable: true, enumerable: true, writable: true, value: app }에 해당하는 프로퍼티 플래그를 갖는다.
   * 그 이외의 나머지 프로퍼티들의 경우 { configurable: false, enumerable: false, writable: false }가 기본값으로써 설정된다.
   * 따라서 나머지 프로퍼티의 경우 수정 삭제 열거가 불가능해진다.
   *
   * ex) app.response.header === undefined
   */

  /**
   * new를 사용하지 않은 이유
   *
   * res, req의 경우 함수가 아닌 개체이므로 new키워드 사용시 에러가 발생한다.
   *
   */

  app.init();
  return app;
}

https://github.com/daeungkim/express/commit/e18ff0686120959901e11e62e229043996ef6095

profile
42seoul cadet

0개의 댓글