클래스 기반 언어와 프로토 타입 기반 언어(Class-based vs. prototype-based languages)

클래스 기반 언어와 프로토 타입 기반 언어(Class-based vs. prototype-based languages)

Java 및 C ++와 같은 클래스 기반 객체 지향 언어는 클래스와 인스턴스라는 두 개의 별개의 엔티티 개념을 기반으로합니다.

클래스는 객체의 특정을 결정짓는 모든 속성들의 집합이다.(java의 메소드와 필드)

인스턴스는 클래스의 인스턴스이다.

아래의 소스를 보면 Animal은 클래스 이고 dog는 Animal의 인스턴스이다.

1
2
3
4
5
6
7

public class Animal {

}

Animal dog = new Animal();

JavaScript와 같은 프로토 타입 언어는 위에서 처럼 클래스와 인스턴스를 구분짓지 않습니다.

또 상속을 프로토타입 복제를 통해서 구현 하고 있습니다.

Douglas Crockford가 한 말 입니다.

프로토 타입을 만들고 객체를 생성 합니다. JavaScript에서는 객체를 변경할수있으니 인자에 새로운 인스턴스와 메소드를 제공하여 객체를 보강할수도 있다.

심지어 새로 보강된 객체가 새로운 프로토타입이 될수도 있다. 객체가 객체를 상속 받는데 어떤것이 더 객체지향이냐?

위에 내용을 이해하기 위해서 다음 포스트에서 자바스크립트에 상속에 대해서 설명하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

var o = {
a: 2,
m: function(b){
return this.a + 1;
}
};

console.log(o.m()); // 3
// o.m을 호출하면 'this' 는 o를 가리킨다.

var p = Object.create(o);
// p 는 프로토타입을 o로 가지는 오브젝트이다.

p.a = 12; // p 에 'a'라는 새로운 속성을 만들었다.
console.log(p.m()); // 13
// p.m이 호출 될 때 'this' 는 'p'를 가리킨다. 'this.a'는 p의 속성이다.


function Graph() {
this.vertexes = [];
this.edges = [];
}

Graph.prototype = {
addVertex: function(v){
this.vertexes.push(v);
}
};

var g = new Graph();


참조