대단한 동현 블로그

상속

js에서 상속은 c++처럼 메모리 블록단위가 아닌 프로토타입이라는 단방향 링크드리스트 기반으로 구현된다.
때문에 c++에서는 포인터 사이즈를 변경해 구현하는 업캐스팅을 js에서는 아래와 같이 프로토타입 변경을 통해 구현할 수 있다
 

프로토타입 체인

상속받은 부모 객체를 못 찾았을때 계속 타고 올라가 찾는 것.(null에 도달할 때까지)

업캐스팅

// 부모 클래스
function Animal(name) {
    this.name = name;
}

Animal.prototype.makeSound = function() {
    console.log("Some generic sound");
};

// 자식 클래스
function Dog(name) {
    Animal.call(this, name); // 부모 생성자 호출
    // Animal클래스로 만들어져서 Dog까지
}

// Dog.prototype을 Animal.prototype을 기반으로 생성
// 프로토타입 체인 노드 한개를 앞으로 땡겨줌
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;

// Dog에 특화된 메서드 추가
Dog.prototype.bark = function() {
    console.log("Woof!");
};

// 인스턴스 생성
let myDog = new Dog("Buddy");

// 업?캐스팅
let animalRef = myDog;

// 부모 클래스의 메서드 호출
animalRef.makeSound(); // 출력: "Some generic sound"

// 자식 클래스의 특화된 메서드는 호출 불가능
// animalRef.bark(); // 이 줄은 에러를 발생시킨다. (anmalRef의 프로토타입은 dog노드까지 닿지 않으므로)

// instanceof 연산자를 통한 타입 체크
console.log(animalRef instanceof Animal); // true
console.log(animalRef instanceof Dog);    // true

 
이런 골때리는 일이 발생한다.
저렇게 프로토타입 체인을 타고타고 변경해버리면 이미 생성되어있는 인스턴스를 변경하는 것도 가능하다.

오버라이딩, 프로퍼티 섀도잉

해당 인스턴스의 프로퍼티를 덮어씌움(프로퍼티 섀도잉)으로써 인스턴스에만 오버라이딩을 구현한다.
모든 객체를 오버라이딩 하고 싶으면 프로토타입체인으로 접근 해서 부모 객체 프로토타입을 변경하면 됨.
 
사실 3달전에 js deepdive스터디하다 적어둔건데 이제서야 올린다..

'<language> > javascript' 카테고리의 다른 글

console.log는 비동기일수도 아닐수도 있습니다  (2) 2024.09.29
javascript 얕은 복사 != 얕은 복사  (2) 2024.07.14
js는 비동기 큐가 2개다?  (1) 2024.03.26
클로저  (1) 2024.01.30
profile

대단한 동현 블로그

@donghyk2

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!