1. 캡슐화 (Encapsulation)
2. 추상화 (Abstraction)
3. 상속 (Inheritance)
4. 다형성 (Polymorphism)
private
키워드 부재 : 클래스 내부에서만 쓰이는 속성과 메서드를 구분하는 private
키워드가 없기 때문에 은닉을 위해 클로져를 사용한다. (TypeScript를 사용하면 private
을 사용할 수 있다)
interface
키워드 부재 : TypeScript에서는 interface
를 사용하여 구현하려는 클래스의 속성/메소드 구현을 강제하여 일관성을 유지할 수 있으며 사용법을 명확하게 해 준다.
[[Prototype]]
)를 가지며 __proto__
를 통해 이에 접근할 수 있다.prototype
은 함수 객체만 가지고 있는 속성으로 해당 함수가 생성자로 사용될 때 이 생성될 객체의 부모 객체 (프로토타입 객체)를 가리킨다.__proto__
가 가리키는 프로토타입 객체의 속성/메서드에 접근할 수 있다.__proto__
로 거슬러 올라가며 부모 객체에 해당 속성/메서드가 존재하는지 검사하는 것Object.prototype
이다. // Declare Class
class Person {
// ...properties & methods
}
// Create instance
const person1 = new Person();
Class는 property와 method를 가진다.
Class의 생성자(constructor)는 this 문맥을 생성하고, 생성자에 인수를 전달할 수 있기에 인스턴스를 생성할 때 속성을 동적으로 설정할 수 있다.
생성자와 동일한 문법으로 클래스에 매서드를 추가할 수 있다. 객체 메소드를 작성할 때, 화살표 함수를 쓰지 않는다. 화살표 함수 자신의 this가 없고 일반 변수 조회 규칙에 따라 현재 범위에서 존재하지 않는 this를 찾기 위해 바깥 범위 this를 검색하게 되기 때문에 화살표 함수를 사용하면 this가 함수가 포함된 객체가 아닌 해당 함수를 둘러싼 lexical scope의 this가 된다.
엄밀히 말해 자바스크립트에는 클래스 개념이 없고, 생성자 함수를 통해 객체를 생성한다. 다만 ES6 이후 class가 syntactic sugar로 새롭게 도입되어 이전보다 단순하게 작성할 수 있게 되었다.
// 클래스 생성 1 : 생성자 함수
function Person(name, age) {
// property
this.name = name;
this.age = age;
}
// add method to prototype
Person.prototype.getName = function() {
return this.name;
}
// 클래스 생성 2 : ES6 class
class Person {
// constructor
constructor(name, age) {
// property
this.name = name;
this.age = age;
}
// method
getName() {
return this.name;
}
}
// 클래스 이름은 PascalCase로 표기한다
class Person {
constructor(name) {
this.name= name;
}
sleep() {
console.log('zzz');
}
}
class Student extends Person {
constructor(name, grade) {
super(name);
this.grade = grade;
}
study() {
console.log('studin');
}
}
const person1 = new Person("Alex");
const student1 = new Student('Lewis', '1st');