자바스크립트 객체는 이름이 지정된 값(키-값의 쌍)의 모음을 나타낸다. 보통 객체의 값을 객체의 프로퍼티(property)라고 한다. 자바스크립트 객체의 프로퍼티에는 함수, 배열, 다른 객체를 비롯해 어떤 타입의 데이터도 담을 수 있다.
자바스크립트 객체는 Object() 생성자 함수를 호출해 생성할 수 있으며, 객체를 생성하고 나면 점(.) 연산을 이용해 해당 객체에 프로퍼티를 추가하거나 삭제할 수 있다. 다음 예제를 보자.
var object1 = new Object(); // 빈 객체 생성 object1.name = "itinpractice.com"; // 프로퍼티 추가 console.log(object1.name); // itinpractice.com delete object1.name; // 프로퍼티 삭제 console.log(object1.name); // undefined
점(.) 대신 대괄호([])로도 자바스크립트 객체의 프로퍼티에 접근할 수 있다. 다음 예제를 보자.
var object1 = new Object(); // 빈 객체 생성 object1['name'] = "itinpractice.com"; // 프로퍼티 추가 console.log(object1['name']); // itinpractice.com delete object1['name']; // 프로퍼티 삭제 console.log(object1['name']); // undefined
리터럴 문법을 이용해 자바스크립트 객체를 생성한 후 해당 객체의 프로퍼티를 지정할 수도 있는데, 객체 리터럴은 객체 초기화자(initializer)라고도 한다.
객체 리터럴은 콜론으로 분리된 키-값의 쌍을 콤마로 분리한 목록으로 구성되며, 이것들은 모두 중괄호로 감싼다. 예를 들어, 다음과 같이 빈 자바스크립트 객체를 생성한다.
var object1 = {}; // 빈 객체 생성 object1['name'] = "tom"; // 프로퍼티 추가 console.log(object1['name']); // tom delete object1['name']; // 프로퍼티 삭제 console.log(object1['name']); // undefined
아울러 다음과 같이 중첩된 자바스크립트 객체를 생성할 수도 있다.
var user = { name: "tom", id: 123, address: { city: 'San Francisco', street: '101 street' }, email: '' }; console.log(user.name); // tom console.log(user.address.city); // San Francisco
자바스크립트 객체를 생성하기 위해 "new" 연산자와 함께 생성자 함수를 호출할 수도 있다. 다음 예제를 보자.
function User(name){ this.name = name; this.id = 123; this.sayHello = function(){ console.log("Hello, I am " + name); }; }; var user1 = new User("Tom"); var user2 = new User("Jerry"); user1.sayHello(); // Hello, I am Tom user2.sayHello(); // Hello, I am Jerry
생성자 함수는 다음과 같은 단계를 거친다.
참고: 어떤 함수가 "new" 연산자와 함께 자바스크립트 객체를 생성하는 데 사용되면 대개 해당 함수의 첫 번째 글자는 대문자로 쓴다.
생성자 함수가 객체를 반환하면 this는 무시된다.
function User(name){ this.name = name; return {name: "Jerry"}; }; var user1 = new User("Tom"); console.log(user1.name); // Jerry
자바스크립트 객체의 프로퍼티에 접근하려고 시도해볼 수 있는데, 만약 프로퍼티가 존재하지 않으면 undefined가 반환된다.
var user = {}; // 빈 객체를 생성 console.log(user.name); // undefined
자바스크립트 객체에 프로퍼티가 존재하는지 검사하기 위해 "in" 연산자를 사용할 수 있다. 다음 예제를 보자.
var user = {name:'Jack'}; console.log('name' in user); // true console.log('address' in user); // false
for…in 문법릉 이용해 자바스크립트 객체의 모든 프로퍼티를 나열할 수 있다. 다음 예제를 보자.
var user = { name: "tom", id: 123, address: { city: 'San Francisco', street: '101 street' }, email: '' }; for (var key in user){ console.log("key = " + key + ", value = " + user[key]); }
실행 결과는 다음과 같다.
key = name, value = tom key = id, value = 123 key = address, value = [object Object] key = email, value =
객체를 변수에 할당할 때 해당 변수는 객체에 대한 참조를 유지한다. 이 변수를 사용해 객체의 프로퍼티를 변경하면 객체를 참조하고 있던 다른 곳에도 영향을 미친다. 다음 예제를 보자.
var user = { name: "tom", id: 123, }; var user2 = user; user2.name = "Jack"; console.log(user.name); // Jack
객체를 함수에 인자로 전달할 경우 값이 아닌 참조가 전달된다. 다음 예제를 보자.
var user = { name: "tom" }; function changeName(obj){ obj.name = "Jack"; } changeName(user); console.log(user.name); // Jack, 이름이 바뀜
함수에 원시 값을 인자로 전달하면 값이 전달되고, 값이 바뀌어도 다른 값에는 영향을 주지 않는다. 다음 예제를 보자.
var user = "Tom"; function changeName(val){ val = "Jack"; }; changeName(user); console.log(user); // Tom, 이름이 바뀌지 않음
자바스크립트 객체에는 함수를 저장할 수도 있는데, 이러한 함수를 보통 메서드(method)라 한다.
var user = { name: "tom and jerry", changeName: function(){ this.name = this.name.toUpperCase(); }, printName: function(){ console.log(this.name); } }; user.changeName(); user.printName(); // TOM AND JERRY
객체로부터 어떤 메서드가 호출될 경우 this는 해당 객체에 대한 참조가 된다.
← 이전 | 홈 | 다음 → |