1. 생성자 함수

ex.

function user(first, last) {
  this.firstName = first
  this.lastName = last
}

const honeyricecake = new user('honey', 'ricecake')
console.log(honeyricecake)

콘솔에는

이렇게 해당 내용의 객체가 출력되는 것을 볼 수 있다.

이 때 user라는 함수를 생성자 함수라고 한다.

function user(first, last) {
  this.firstName = first
  this.lastName = last
}

user.prototype.getFullName = function () {
  return `${this.firstName}${this.lastName}`
}

const honeyricecake = new user('honey', 'ricecake')

console.log(honeyricecake.getFullName())

이렇게 하면 getFullName이라는 메소드를 user라는 생성자 함수로 만들어낸 모든 객체에서 사용할 수 있다.

그럼 메소드를 생성자함수 내에서 선언하는 것과 prototype으로 선언하는 것의 차이는 무엇일까?

몇 개의 객체를 만들던 메소드는 한번만 선언되었으므로 메모리의 낭비가 없어진다!

이 때 일반적인 함수와 생성자가 구분이 안되므로 우리는 생성자 함수의 첫글자는 대문자로 작성한다.

이런 식으로 생성자를 통해 만들어낸 객체는

해당 생성자로 만들어졌다는 정보를 담고 있다는 것을 알 수 있고
proto로 만든 getFullName함수의 정보 역시 가지고 있음으로 볼 수 있다.

ex.

function User(first, last) {
  this.firstName = first
  this.lastName = last
}

User.prototype.getFullName = function () {
  return `${this.firstName}${this.lastName}`
}

const honeyricecake = new User('honey', 'ricecake')

console.log(honeyricecake.getFullName())

2. this

메소드는 호출한 객체로 this 정의
함수는 this가 지정되지 않음(?!)
화살표 함수는 함수 선언 시점에서의 상위 스코프가 this로 정의

그래서 메소드 안에 함수를 정의해서 그 안에 this를 사용하고 싶다면
함수는 화살표함수를 사용하자.
그러면 함수 선언 시점에서의 상위 스코프인 객체가 this로 정의된다.

https://velog.io/@padoling/JavaScript-%ED%99%94%EC%82%B4%ED%91%9C-%ED%95%A8%EC%88%98%EC%99%80-this-%EB%B0%94%EC%9D%B8%EB%94%A9

이 글을 참고하자!

이렇게 메소드를 정의하는 경우, heropy에 정의된 메소드의 내용을 그대로 가져오게 된다.

즉, 메소드를 정의하는 경우는 함수를 사용하는 것이
메소드 내부에서 함수를 한번 더 선언해줄 일이 있을 때는 화살표 함수를 사용하는 것이 더 this를 명확하게 해준다.

3. ES6 Classes

우리는 메소드를 정의할 때 지금까지

normal: function() {
  console.log(this.name)
}

이런 식으로 써왔는데

이는

normal() {
  console.log(this.name)
}

이렇게도 쓸 수 있다.
즉, function 키워드 없이도 메소드를 선언할 수 있는 것이다. (세상에)

자바 스크립트에서 지원하는 Class 라는 키워드의 사용법으로 위에서 알아본 생성자함수와 prototype을 대체해보자.

class User {
  constructor(first, last) {
    this.firstName = first
    this.lastName = last
  }

  getFullName() {
    return `${firstName}${lastName}`
  }
}

메소드가 function키워드 없이도 정의되는 것을 이용해서 훨씬 더 간단하게 만들 수 있다.

즉, 객체의 생성자 함수인 constructor함수를 function 키워드 없이 정의하고
getFullName 메소드 역시 마찬가지이다.

자바와 거의 유사하나 차이점은 필드 변수를 따로 선언해주지 않아도 된다는 것이다.

4. 상속(확장)

자바와 매우 유사하다.

이 때 부모 클래스의 메소드를 super 키워드를 이용해서 호출할 수 있다.

ex. super.method()

0개의 댓글