wonsss / vanila-js-wiki

1 stars 0 forks source link

Class #2

Open wonsss opened 2 years ago

wonsss commented 2 years ago

클래스

자바스크립트는 프로토타입 기반 객체지향 언어이다. 프로토타입 기반 객체지향 언어는 클래스가 필요 없는 객체지향 프로그래밍 언어다. ES5에서는 클래스 없이도 다음과 같이 생성자함수프로토타입 을 통해 객체지향 언어의 상속 을 구현할 수도 있다.

// ES5 생성자 함수
const Person = (function () {
  //생성자 함수
  function Person(name) {
    this.name = name;
  }

  // 프로토타입 메서드
  Person.prototype.sayHi = function () {
    console.log("Hi! My name is " + this.name);
  };

  // 생성자 함수 반환
  return Person;
})();

//인스턴스 생성
const me = new Person("Marco");
me.sayHi(); //"Hi! My name is Marco"

ES6 에서 도입된 클래스는 사실 함수이며 기존 프로토타입 기반 패턴을 클래스 기반 패턴처럼 사용할 수 있도록 하는 문법적 설탕 이라고 볼 수도 있으나, 클래스의 extends와 super 키워드는 상속 관계 구현을 더욱 간결하고 명료하게 하므로 새로운 객체 생성 메커니즘으로 보는 것이 좀 더 합당하다.

[3.2 분량 시작]

프로퍼티

인스턴스 프로퍼티

접근자 프로퍼티

class Person {
  constructor(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }

  get fullName() {
    return `${this.firstName} ${this.lastName}`;
  }

  set fullName(name) {
    // setter는 매개변수를 하나만 받을 수 있다.
    [this.firstName, this.lastName] = name.split("");
  }
}
class Person {
  constructor(name) {
    this.name = name;
  }
  set nicknameFunc(value) {
    this.nickname = value;
    console.log("Set complete");
  }
  get nicknameFunc() {
    console.log(`Your nickname is ${this.nickname}`);
  }
}

const marco = new Person("Marco");
marco.nicknameFunc = "Porco";
marco.nicknameFunc;

private 프로퍼티

클래스는 일차적으로 자바스크립트의 기존 프로토타입 기반 상속에 대한 문법적 설탕(Syntax Sugar)이다. 클래스 문법이 자바스크립트에 새로운 객체 지향 상속 모델을 도입하는 것은 아니다.

클래스 생성

(클래스를 마치며 심화) new 바인딩

wonsss commented 2 years ago

new.target

new 연산자와 관련한 속성인 target new.target 속성은 함수 또는 생성자가 new 연산자를 사용하여 호출됐는지를 감지한다. 이를 이용하여 new 연산자를 사용하여 호출하지 않았다면 error를 발생시키는 방법을 사용해 new를 쓰지 않고 실수로 함수를 바로 호출했을 때 그것을 방지하도록 막을 수도 있다.

function test(name) {
    if(!new.target) throw 'new 연산자를 사용하세요';
    this.name = name;
}

또는 new 미사용시 인스턴스화를 해줄 수도 있다.

function test(name) {
    if(!new.target) return new test(name); // new를 사용하지 않았을 때 자동으로 인스턴스 생성해준다
    this.name = name;
}

클래스는 함수와 다르게 new 연산자 없이는 호출이 불가능하므로 new를 사용할 때 new.target의 값만 보면 된다. new.target을 사용하면 인스턴스화된 클래스 자신을 반환한다.

MDN- new.target