자바스크립트 객체

1 minute read


자바스크립트 객체 지향

객체지향 프로그래밍의 개념은 자바스크립트에서도 동일하게 적용된다. 하지만 자바스크립트의 객체 지향의 특징은 어떠한 객체지향 언어와도 비슷하지 않은 자신만의 독특한 성격을 가지고 있다.

이런 계열는 언어를 프로토타입 기반 프로그래밍(prototype-based programming)에 속한다. 따라서 c++같은 정통 객체지향 언어를 먼저 접했다면 혼란을 느낄 수 있다.


객체 생성

객체란 서로 연관된 변수와 함수를 그룹핑한 그릇이라 할 수 있으며 객체안의 변수는 property 함수는 method로 부른다.

// 빈 객체 생성
var person = {}

비어있는 객체가 만들어지며 이 객체(object)는 object이름을 가진다.

객체에 변수와 함수를 담는 방법

// 프로퍼티 property
person.name = 'bak';
// 메서드 method
person.introduce = function() {
  return 'My name is '+this.name;
}

person.introduce();
// My name is bak;

객체의 정의에 집중도를 높이기 위해 코드를 바꾸어 본다.

var person = {
  'name' : 'bak',
  'introduce : 'function() {
    return 'My name is '+this.name;
  }
}
person.introduce();

두 방식 중 뭐가 더 좋다고 단정할 수 없지만 이런 방식으로 객체가 만들어진다는게 중요하다.


중복되는 동작의 객체

다수의 객체를 생성할 때는 이렇게 만들 수 있다.

var person1 = {
  'name' : 'bak',
  'introduce : 'function() {
    return 'My name is '+this.name;
  }
}

var person2 = {
  'name' : 'coding',
  'introduce : 'function() {
    return 'My name is '+this.name;
  }
}

하지만 코드의 출력결과만 다를뿐 핵심적인 동작방식들이 모두 중복된다면 프로그래머로서 절대 넘어갈 수 없는 부분이다.

생성자(constructor)
객체를 만드는 역할을 하는 함수이다. 자바스크립트에서 함수는 재사용이 가능한 로직의 묶음이 아닌 객체를 만드는 창조자라고 볼 수 있다.

function Person() {}
var p0 = Person();
p0
// undefined

빈 Person 함수를 변수에 저장하고 호출할시 당연히 내용이 없기 때문에 undefined가 뜬다.

function Person() {}
var p1 = new Person();
p1
// Person {}

하지만 new라는 키워드를 붙이고 함수를 호출하면 p1변수에는 함수가 아닌 Person 객체가 저장된다.

이렇게 new 키워드 뒤에 오는건 함수가 아니라 생성자라고 부르며 새로운 객체를 생성하게 된다. 즉 new Person()은 객체를 반환한다.

지금 p1의 모습은 다음과 같다.

// 비어있는 객체를 할당한 것
var p = {}

생성자를 통한 중복 코드 개선

function Person(name) {
  this.name = name;
  this.introduce = function() {
    return 'My name is '+this.name;
  }
}
var p1 = new Person('bak');
var p2 = new Person('kim');

p1.introduce();
p2.introduce();

생성자는 객체를 초기화하는 역할을 한다.


전역객체

모든 객체는 전역객체의 프로퍼티이다.

function Func() {
  alert('hello');
}

Func();
// 객체의 속성 호출
window.Func();

따로 객체의 명시가 없다면 암시적으로 Func() 함수는 window 객체의 속성으로 간주된다. 따라서 Func()와 window.Func()는 동일한 동작을 한다.

자바스크립트의 모든 전역변수와 함수는 기보적으로 이 전역 객체인 window의 프로퍼티이다. 전역 객체의 이름은 환경에 따라서 다르며 window, global 등의 이름으로 쓰인다.