OOP in javascript

prototype

타 언어의 전통적인 상속은 상속을 구현하기 위해 많은 부수적인 것들을 고려해야 됐다. 반면에 자바스크립트의 상속은 prototypal inheritance로 좀 더 유연하고 직관적이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var person = {
firstname: 'Default',
lastname: ;Default',
getFullName: function() {
return this.firstname + ' ' + this.lastname;
}
}

var john = {
fristname: 'John',
lastname: 'Doe'
}

//don't do this Ever! demo purposes only!
john.__proto__ = person;
//john 객체에서 속성이나 메소드 탐색 후 없으면 proto{} 탐색
console.log(john.getFullName()); // John Doe

var jane = {
firstname: 'Jane';
}

jane.__proto__ = person;
console.log(jane.getFullName()); // Jane Default;

Everyting is and object

1
2
3
4
5
6
7
var a = {};
var b = function() {};
var c = [];

a.__proto__. // Object{} (base object);
b.__proto__. // Empty() {} (base function object);
c.__proto__. //

b 는 빈함수임에도 proto 를 살펴보면 기본 함수 객체의 모든 메소드들에 접근이 가능하다. (빈 배열, 객체도 마찬가지) 우리가 어떤 배열, 객체, 함수를 생성했을 때 따로 명시적으로 메소드를 생성하지 않더라도 자바스크립트 엔진이 프로토타입을 자동으로 기본 객체들에 연결해준다. 이 때문에 기본 객체들에 있는 메소드들을 새로 생성한 객체에서도 자유롭게 사용할 수 있는 것이다.

Reflection and Extend

함수정의 때와 다른 인자 개수를 받을 때는 arguments 를 통해 처리할 수 있다.

(추후 수정)

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
34
35
var person = {
firstname: 'Default',
lastname: ;Default',
getFullName: function() {
return this.firstname + ' ' + this.lastname;
}
}

var john = {
fristname: 'John',
lastname: 'Doe'
}

for (var prop in john) {
if (john.hasOwnProperty(prop)) {
console.log(prop + ': ' + john[prop])
}
}
// firstname : 'John', lastname : 'Doe'

var jane = {
address: '111 Main St.';
getFormalFullName: function() {
return this.lastname + ', ' + this.firstname;
}
}

var jim = {
getFirstName: function() {
return firstname;
}
}
// 다른 객체들의 속성들을 다른 객체에게 전달하고 싶다면?
_.extend(john, jane, jim ..);
// 다른 객체들의 속성,메소드들을 추가한 john 객체가 리턴 됨.

building an object

Functional programming

Share