본문 바로가기

언어/javascript

javascript : prototype, constructor

반응형

Java를 사용해본 사람이라면 Class에 대해서 매우 친숙하다. 

JavaScirpt도 객체지향 설계를 위해서 이러한 객체들을 prototype이라는 규칙아래에서 사용한다.

 

What is Prototype?

 

https://medium.com/@bluesh55/javascript-prototype-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-f8e67c286b67

다른 블로그에서 그림을 가져왔다.

 

일반적으로 function 을 사용해서 객체를 정의하게 되면은 함수와 prototype Object가 동시에 생성된다.

그러면 함수내의 prototype이라는 link를 통해 Prototpye Object에 접근이 가능하다.

 

따라서 Person.prototpye.eyes = 3 을 사용하게되면 Prototype Objejct에 직접적으로 접근가능한것이다.

 

이처럼 Prototype Object란 JAVA에서 static 영역처럼 객체가 공유하는 데이터처럼 느껴진다.

 

그렇다면 _proto_는 무엇인가?? _proto_는 일종의 상위객체의 link이다. 저 link를 타고 상위객체에 접근이 가능한것이다.

 

따라서 kim.eyes 라는 접근이 가능하고 kim.toString 같이 kim에는 toString 같은 메서드가 없지만 최 상위 클래스인 objejct의 메서드를 접근 가능한것이다.

 

 

function Rectangle(w, h) {
    var width = w;
    var height = h;

    this.getWidth = function () { return width; };
    this.getHeight = function () { return height; };
    this.setWidth = function (w) {
        if (w < 0) {
            throw '길이는 음수일 수 없습니다.';
        } else {
            width = w;
        }
    };

    this.setHeight = function (h) {
        if (h < 0) {
            throw '길이는 음수일 수 없습니다.';
        } else {
            height = h;
        }
    };
}

Rectangle.prototype.getArea = function () {
    return this.getWidth() * this.getHeight();
};

function Square(length) {
    this.base = Rectangle;
    this.base(length, length);
}

Square.prototype = Rectangle.prototype;
Square.prototype.constructor = Square;

// 변수를 선언합니다.
var rectangle = new Rectangle(5,7);
var square = new Square(5);
console.log(rectangle.getArea()+ ' : '+ square.getArea());

console.log(square instanceof Rectangle);
 
35 : 25
true

위의 예제를 살펴본다면  Rectangle에는 벼누와 메서드가 정의 되어있다.

이러한 Rectangle에 getArea를 prototype을 이용해서 정의한다.

 

여기서 Square의 객체의 정의를 살펴보면 Rectangle 에다 생성시 length라는 값을 추가적으로 넣는다.

이렇게되면 Square은 new를 할당할시 Rectangle을 생성한다.

 

그리고 Square의 프로토타입을 Rectangle의 프로토타입과 동일시하게 함으로써 함수를 사용할 수 있게한다.

Square.prototype.constructor = Square; 은 없어도 되는 문구이지만 직접 square 객체의 constructor() 메서드를 출력한다면 생성자 함수 Square가 아니라 생성자 함수 Rectangle을 가리키는것을 알 수 있다.

 

당연한 점은 square.width는 호출할 수가 없다. 

반응형

'언어 > javascript' 카테고리의 다른 글

javascript : 기본자료형  (0) 2020.12.15
javascirpt : 클래스 선언과 속성  (0) 2020.12.15
javascript : 상속  (0) 2020.12.10
javascript : new 키워드  (0) 2020.12.09
javascript : 프로토타입으로 메서드 생성  (0) 2020.12.09