2022. 12. 5. 14:05ㆍjs
클래스의 인스턴스 생성과정
new 연산자와 함께 클래스를 호출하면 생성자 함수와 마찬가지로 클래스의 내부 메서드 [[construct]] 가 호출 된다
인스턴스 생성과 this바인딩.
new 연산자와 함께 클래스 를 호출 하면 빈객체가 우선 생성된다 이때 생성한 인스턴스의
프로토타입으로 클래스의 프로토타입 프로퍼티가 가르키는 객체가 설정 된다 .
이때 암묵적으로 this에 빈 객체가 할당 된다 .
인스턴스의 초기화
this에 할당된 빈객체가 constructor 코드의 실행으로 변경된다.
인스턴스의 반환 클래스의 내부 처리가 끝나면 바인딩된 instance가 반환된다.
25.7 프로퍼티
인스턴스 프로퍼티
인스턴스 프로퍼티는 constructor내부에서 정의해야 한다.
기본적으로 public 형태의 값으로 동작 한다.
따라서 접근자 프로퍼티를 사용하는데
자체적으로 값을 갖지 않고 다른 데이터의 값을 읽거나 저장 할 때 사용되는 접근자 함수로
구성된 프로퍼티
접근자 프로퍼티는 class 내부에서도 사용 가능하다.
클래스 필드 정의 제안
TC39 프로세스에서 제안된 내용으로
다른 객체지향 언어들이 사용하는 this없이 객체의 필드에 접근하는 것을 말하며
이전까지의 js의 경우 this 를 추가하지 않는다면 사용이 불가능 했으나 클래스 필드를 정의한 내용에서는
this를 객체의 멤버 변수로 사용하는 방식이고 최신 ecma에서 등록이 되어있다. 이를 통해
private, public, protected와 같이 일반적인 클래스 기반의 언어처럼 사용 할 수 있게 되었다.
상속에 의한 클래스 확장
클래스 상속과 생성자 함수 상속
이전의 프로토타입 상속과는 틀이 달라진다. 이전의 프로토타입은 프로토타입 체인을 기준으로
체인을 엮어서 다른 객체의 내용을 상속받는 내용이라면 클래스의 상속은
클래스 전체를 상속받아서 확장 하여 정의하는 내용을 말한다.
extends 를 이용하여 상속하게 된다.
const Animal = (function () {
function Animal(age, weight) {
this.age = age;
this.weight = weight;
}
Animal.prototype.eat = function () {
return 'eat';
}
Animal.prototype.move = function () {
return 'move';
}
return Animal;
}());
const Bird = (function () {
function Bird() {
Animal.apply(this, arguments);
}
Bird.prototype = Object.create(Animal.prototype)
Bird.prototype.constructor = Bird;
Bird.prototype.fly = function () {
return 'fly';
}
return Bird;
}());
프로토 타입을 이용한 상속.
class Base{
constructor() {
console.log("base");
}
}
class Devered extends Base {}
new Devered();
''' base '''
를 하게 되면 상속 받은 base 의 constructor에 있는 console.log('base')
이때 Devered의 constructor에서는 암묵적으로 super(..args) 를 호출 하기 때문에
super 의 constructor에 있는 console.log('base') 가 실행됨을 알 수 있다.
이때 extends 의 경우 받는 대상은 클래스가 되어야 하고, 상속 해주는 대상은
함수도 될 수 있고, 클래스도 될 수 있다.
super는 나에게 상속을 준 클래스를 뜻하고 키워드로 함수처럼 호출도 가능하다.
서브클래스에서는 constructor를 생략하지 않는다면, 부모 클래스의 super를 호출 해줘야 한다.
이는 내 일부분을 부모에서 상속받아서 사용하는데 없이 사용하면 안되는것과 같은 이유 때문이다.
이때 es6이후에서 메서드 축약 표현으로 정의된 함수만이 [[HomeObject]]를 갖게 되는데 이는
일반 함수에서는 [[HomeObject]]가 존재하지 않는데 이 공간은 super가 위치하는 공간이라고 볼 수 있다.
따라서 사용에 유의해야 한다.
서브 클래스의 인스턴스 생성과정.
일반적인 클래스의 인스턴스 생성과정과 크게 다르지 않으나
내부적으로 수퍼클래스의 인스턴스 생성과정을 거친후에 서브 클래스의 세부적인 내용들이
들어간다는 점이 차이점이다.
표준 빌트인 생성자 함수확장.
위의 내용또한 [[construct]]내부 메서드를 가지게 되면 어떤 것이라도 사용 할 수 있기 때문에
extends를 이용하여 확장 가능하다.