OOP에서 class는 세부 사항(속성) 이 정의되지 않은 청사진(형태) 인데 여기서 세부 사항만 정의해준다면 객체가 된다. JS에서 사용하는 용어와 별개로 class를 통해 만들어진 객체를 특별히 인스턴스 객체, 줄여서 인스턴스라고 한다.
세부 사항은 어떻게 정의해줘야 할까?
이 역할을 하는 것이 생성자 이다.
생성자는 class 내에서 객체를 생성하고 초기화 시키는데, 이를 통하여 세부사항을 정의해 준다.
ES6 문법으로
class Student{
constructor(){
this.name = 'lee' // 하드코딩으로 name 을 'lee'로 초기화 시켰다.
}
}
const lee = new Student()
//빈 () 는 생성자를 의미한다
//생성자의 parameter 설정에 따라 바뀔 수 있다.
생성자에 papamater가 들어가는 경우
class Student{
constructor(name , age ){
this.name = name
this.age = age
}
}
const son = new student('son',24.5)
JS 의 모든 객체는 자신의 부모 역할을 담당하는 객체와 역할되어 있는데 JS 에서 이러한 부모 객체를 Prototype 객체 줄여서 Prototype이라 한다.
(JAVA 에서 Object 객체인듯)
이것은 마치 객체 지향의 상속 개념과 같이 부모 객체의 프로퍼티 또는 메소드를 상속받아 사용할 수 있게 하는데 이를 Prototype chain 이라고 부르며 JS에서 다른 객체에 정의된 메소드와 속성을 한 객체에서 사용할 수 있도록 하는 근간이다.
//정확하게는 각 객체가 아니라 객체의 생성자의 prototype 이라는 속성에 정의되어 있다
//인터널 슬롯(internal slot) 에 대한 개념은
https://stackoverflow.com/questions/33075262/what-is-an-internal-slot-of-an-object-in-javascript
여기서...
const Student = {
name: 'Lee',
score: 90
}
console.log(Student.__proto__ === Object.prototype); // true
이렇게 객체를 생성할 때 프로토타입은 결정된다.
결정된 프로토타입 객체는 다른 임의의 객체로 변경할 수 있는데, 이것은 부모 객체인 프로토타입을 동적으로 변경할 수 있다는 것을 의미한다.
이러한 특징을 활용하여 객체의 상속을 구현할 수 있다.
class Student{
constructor(name , age ){
this.name = name
this.age = age
}
}
const son = new Student('son',24.5)
Student.prototpye.ask = ()=>{
console.log('외않되??')
}
son.ask() //외않되