객체 생성
- 리터럴 방식으로 간단하게 아래와 같이 key-value 쌍으로 객체를 만들 수 있음, 메소드도 가능함
const object = {
property: 'value',
method: function() { },
};
function NewObject(name) {
this.name = name;
}
const newObject = new NewObject('kevin');
const newObject2 = Object.create(Object.prototype,
{
name: {
value: 'kevin',
writable: true,
enumerable: true,
configurable: true,
},
},
);
newObject2.name = 'Kim';
for (const key in newObject2) {
console.log(key);
}
프로퍼티 열거
- for in 문을 통해서 객체를 열거할 수 있음
const obj = {
prop1: 'value1',
prop2: 'value2',
prop3: 'value3',
prop4: 'value4',
};
for (const key in obj) {
console.log(key);
}
obj.prop1
const prop = 'prop'
obj[prop + 1]
for (const key in obj) {
console.log(obj[key]);
}
- 객체의 경우, 본인의 값을 찾기 위해서 스코프를 계속 체이닝처럼 따라감
- 이를 방지하고자
hasOwnProperty
메소드를 씀, 이를 통해 상위의 값을 체이닝을 통해서 가져와서 쓰지 않게함
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
console.log(obj[key]);
}
}
프로퍼티 조작
- 새로운 값을 추가하는데 있어서 아래와 같이 직관적으로 할 수 있음
- 예시에서 const는 재할당을 막는 것이지, 저장된 객체, 함수, 배열을 바꾸는데 지장은 없음
const person = {
firstName: 'kevin',
location: 'korea',
};
person.lastName = 'hart';
person.lastName = 'ha-rt';
delete person.location;
- 위의까지 한다면 생성, 열거, 조작으로 객체의 기본적인 처리는 끝낸 것
프로퍼티 접근자
- getter, setter라고 좀 더 안전하게 객체에 접근하고 처리하는 방식임
- 예시와 같이 사용할 수 있음(이때 변수명은 우회해서 유의해야함)
const person = {
_firstName: 'kevin',
lastName: 'hart',
get firstName() {
return this._firstName.toUpperCase();
},
set firstName(newFirstName) {
if (typeof newFirstName !== 'string') {
this._firstName = 'undefined name';
return;
}
this._firstName = newFirstName;
},
get fullName() {
return (this._firstName + this.lastName + '입니다.');
},
};
person.firstName = 12345;
console.log(person.firstName);
person.fullName;
- 이를 통해 조금 더 안전하게, 일관성 있게 관리할 수 있음
인스턴스
- 인스턴스는 어떻게 보면 유일한 객체라고도 볼 수 있음, 아래 예시처럼 완전히 같은 두 객체도 각자의 인스턴스임
- 마치 동명이인을 주민등록번호로 식별하듯이 완전히 같아보이는 객체도 각자의 인스턴스가 있음
- 이는 객체의 속성이 같을지언정, 객체를 비교할 땐 객체가 저장된 메모리 주소를 보기에 같아 보이는 객체도 같다고 할 수가 없음
const me = {
name: 'kevin',
age: 10,
location: 'korea',
};
const me2 = {
name: 'kevin',
age: 10,
location: 'korea',
};
console.log(me === me2)
console.log(me.name === me2.name)
생성자
- 만약 앞서 배운 객체에 대해서 같은 양식에 있어서 계속 인스턴스를 만들고 싶다면, 매번 똑같은 양식을 복붙 내지 쓰지 않고 생성자 함수를 쓸 수 있음
const me = {
name: 'kevin',
age: 10,
location: 'korea',
};
function Person(name, age, location) {
this.name = name;
this.age = age;
this.location = location;
this.getName = function () {
return this.name + '입니다';
};
}
const me = new Person('leona', 20, 'korea');
const you = new Person('kim', 30, 'china');
me.getName();
you.getName();