기본적으로 자바스크립트는 프로토타입 기반의 객체지향언어다. ES6
부터 추가된 class
문법은 기존의 ES5
까지 사용하던 객체지향 설계 방식의 Syntatic Sugar다.
//ES5
var Book = (function() {
var name = '';
var category = '';
//생성자 함수
function Book(arg1, arg2) {
name = arg1;
category = arg2;
}
Book.prototype.getInfo = function() {
console.log('Name : ' + name + ', Category : ' + category);
}
return Book;
}());
var dom = new Book('DOM을 깨우치다', 'Web');
dom.getInfo();
//ES6
class Book {
constructor(arg1, arg2) {
this.name = arg1;
this.category = arg2;
}
getInfo() {
console.log(`Name : ${this.name}, Category : ${this.category}`);
}
}
var dom = new Book('DOM을 꺠우치다', 'Web');
dom.getInfo();
class Developer {
}
console.log(window.Developer); //undefined
console.log(Developer === Developer.prototype.constructor); //true
생성자를 생략하면 빈 객체를 생성하고 property
를 동적으로 생성할 수 있다.
class Developer {
}
const jang = new Developer();
console.log(jang); //Developer {}
jang.nation = 'Korea';
console.log(jang); //Developer {nation: "Korea"}
class Foo {
const name = ''; //Uncaught SyntaxError: Unexpected identifier
}
class Bar {
constructor(name = '') {
this.name = name;
}
}
const bar = new Bar('BKJang');
console.log(bar); //Bar {name: "BKJang"}
class Person {
constructor(name) {
this.name = name;
}
//getter
get personName() {
return this.name ? this.name : null;
}
//setter
set personName(name) {
this.name = `Developer ${name}`;
}
}
const person = new Person('BKJang');
console.log(person.personName); //BKJang
person.personName = 'BKJang';
console.log(person.personName); //Developer BKJang
- 프로퍼티에 접근하면
getter
가 호출된다. - 프로퍼티에 값을 할당하면
setter
가 호출된다.
class
의 Static 메서드는 인스턴스로는 접근할 수 없고, 클래스 명으로 접근한다.
class Foo {
constructor(name) {
this.name = name;
}
static staticMethod() {
console.log(this);
}
}
const bkjang = new Foo('BKJang');
Foo.staticMethod(); //class Foo { ... }
bkjang.staticMethod(); //bkjang.staticMethod is not a function
class
의 Static 메서드내부에서는this
를 통해 property에 접근할 수 없다.
class Bar {
constructor(name) {
this.name = name;
}
returnThis() {
console.log(`returnThis : ${this}`);
}
static staticMethod() {
console.log(`staticMethod : ${this}`);
console.log(this.name);
}
}
const bkjang = new Bar('BKJang');
bkjang.returnThis(); //returnThis : [object Object]
Bar.staticMethod();
class
의 Static 메서드는prototype
에 추가되지 않는다.
class Bar {
constructor(name) {
this.name = name;
}
returnThis() {
console.log(`returnThis : ${this}`);
}
static staticMethod() {
console.log(`staticMethod : ${this}`);
console.log(this.name);
}
}
const bkjang = new Bar('BKJang');
console.log(bkjang.returnThis === Bar.prototype.returnThis); //true
console.log(Bar.staticMethod === Bar.prototype.staticMehtod); //false
class Person {
constructor(name, sex) {
this.name = name;
this.sex = sex;
}
getInfo() {
return `Name : ${this.name}, Sex : ${this.sex}`;
}
getName() {
return `Name : ${this.name}`;
}
getSex() {
return `Sex : ${this.sex}`;
}
}
class Developer extends Person { //extends를 사용하여 Person 클래스 상속
constructor(name, sex, job) {
//super메서드를 사용하여 부모 클래스의 인스턴스를 생성
super(name, sex);
this.job = job;
}
//오버라이딩
getInfo() {
//super 키워드를 사용하여 부모 클래스에 대한 참조
return `${super.getInfo()} , Job: ${this.job}`;
}
getJob() {
return `Job : ${this.job}`;
}
}
const person = new Person('SHJo', 'Male');
const developer = new Developer('BKJang', 'Male', 'Developer');
console.log(person); //Person {name: "SHJo", sex: "Male"}
console.log(developer); //Developer {name: "BKJang", sex: "Male", job: "Developer"}
console.log(person.getInfo()); //Name : SHJo, Sex : Male
console.log(developer.getName()); //Name : BKJang
console.log(developer.getSex()); //Sex : Male
console.log(developer.getJob()); //Job : Developer
console.log(developer.getInfo()); //Name : BKJang, Sex : Male , Job: Developer
console.log(developer instanceof Developer); //true
console.log(developer instanceof Person); //true