객체는 0개 이상의 프로퍼티로 구성된 집합이며, 프로퍼티는 키 와 값으로 구성된다.
var person={
name: 'andy', //프로퍼티
age: 20, //프로퍼티 (age:키, 20:value)
}
❗️자바스크립트의 함수는 일급함수 이므로 값으로 취급할 수 있다. 따라서 함수도 프로퍼티 값으로 사용할 수 있다. 프로퍼티 값이 함수일 경우, 일반 함수와 구분하기 위해 메서드라 부른다.
var counter={
num: 0, //프로퍼티
func: function(){
return this.num++; //메서드
}
}
1.) 프로퍼티: 객체의 상태를 나타내는 값(data);
2.) 메서드: 프로퍼티(상태 데이터)를 참조하고 조작할 수 있는 동작(behavior);
객체의 상태를 나타내는 값(프로퍼티)과 프로퍼티를 참조하고 있는 동작(메서드)을 모두 포함할 수 있다.
//객체 리터럴에 의한 객체 생성
var person ={
name:'andy',
func: function(){
console.log(`hello my name is ${this.name}`);
}
}
console.log(typeof person); //object
person.func()//hello my name is andy
만약 중괄호 내에 프로퍼티를 정의하지 않으면 빈 객체가 생성된다.
var empty={};
console.log(empty); //{}출력
객체는 프로퍼티의 집합이며 , 프로퍼티는 키와 값으로 구성된다.
var person={
name: 'andy',//프로퍼티 키는 name, 값은 문자열 andy
age: 25, //프로퍼티 키는 age, 값은 숫자 25
}
프로퍼티 키: 빈 문자열을 포함하는 모든 문자열 또는 심벌 값
프로퍼티 값: 자바스크립트에서 사용할수 있는 모든 값
var obj={};
var key='key';
obj[key]= 1;
console.log(obj); // {key:1} 출력
var obj={
'':'' //빈 문자열도 프로퍼티 키로 사용할 수 있다
}
console.log(obj);
var name={
name: 'andy',
name: 'han'
}
console.log(name); //{name: han}출력
자바스크립트에서 사용할 수 있는 모든 값은 프로퍼티 값으로 사용할 수 있다고 했다. 따라서 함수는 값으로 취급할 수 있기 때문에 프로퍼티 값으로 사용할 수 있다. 프로퍼티 값이 함수일 경우 일반 함수와 구분하기 위해 메서드라 부른다. 즉 메서드는 객체에 묶여 있는 함수를 의미한다.
var circle={
radius: 5, //프로퍼티
getDiameter: function(){ //메서드
return this.radius *2; //this는 circle을 가리킨다.
}
};
console.log(circle.getDiameter()); //10
1.) 마침표 프로퍼티 접근 연산자(.)를 사용하는 마침표 표기법
2.) 대괄호 프로퍼티 접근 연산자([...])를 사용하는 대괄호 표기법
var person={
name:'han'
}
console.log(person.name); //han 출력
console.log(person['name']); // han 출력
var person={
'first-name':'han',
1:32
}
console.log(person.'first-name'); //error 출력
console.log(person.first-name); //error 출력
console.log(person[first-name]); //error 출력
console.log(person['first-name']); //han 출력
console.log(person.1) //error출력
console.log(person.'1') //error출력
console.log(person['1']); //32 출력
console.log(person[1]); //32 출력
이미 존재하는 프로퍼티에 값을 할당하면 프로퍼티 값이 갱신된다.
//프로퍼티 값 갱신
var person={
name: 'andy',
}
person.name='han';
console.log(person); //{name: 'han'}출력
존재하지 않는 프로퍼티에 값을 할당하면 프로퍼티가 동적으로 생성되어 추가되고 프로퍼티 값이 할당된다.
//프로퍼티 동적 생성
var person={
name: 'andy',
}
person.name='han';
console.log(person);
person.age=25;
console.log(person); //{name: 'han', age:25}출력
delete 연산자는 객체의 프로퍼티를 삭제한다. 이때 delete연산자의 피연산자는 프로퍼티 값에 접근할 수 있는 표현식이어야 한다. 만약 존재하지 않는 프로퍼티를 삭제하면 아무런 에러 없이 무시된다.
//프로퍼티 삭제
delete person.age;
ES6에서는 더욱 간편하고 표현력 있는 객체 리터럴의 확장 기능을 제공한다.
객체 리터럴의 프로퍼티는 프로퍼티 키와 프로퍼티 값으로 구성된다. 프로퍼티 값은 변수에 할당된 값, 즉 식별자 표현식일 수도 있다.
//프로퍼티 축약 표현
//ES5
var x=1,y=2;
var obj={
x:x,
y:y,
}
console.log(obj); // {x:1 ,y:2} 출력
ES6에서는 프로퍼티 값으로 변수를 사용하는 경우 변수 이름과 프로퍼티 키가 동일한 이름일 때 프로퍼티 키를 생략 할 수 있다. 이때 프로퍼티 키는 변수 이름으로 자동 생성된다.
//ES6
var obj={
x,y
}
console.log(obj);//{x:1, y:2} 출력
문자열 또는 문자열로 타입 변환할 수 있는 값으로 평가되는 표현식을 사용해 프로퍼티 키를 동적으로 생성 할 수도 있다. 단, 프로퍼티 키로 사용할 표현식을 대괄호([...])로 묶어야 한다.
//ES5
var prefix = 'prop';
var i=0;
var obj={};
//계산된 프로퍼티 이름으로 프로퍼티 키 동적 생성
obj[prefix + '-' + ++i] =i;
obj[prefix + '-' + ++i] =i;
obj[prefix + '-' + ++i] =i;
console.log (obj); //{ 'prop-1': 1, 'prop-2': 2, 'prop-3': 3 }
ES6에서는 객체 리터럴 내부에서도 계산된 프로퍼티 이름으로 프로퍼티 키를 동적 생성할 수 있다.
//ES6
const prefix = 'prop';
let i=0;
//객체 리터럴 내부에서도 계산된 프로퍼티 이름으로 프로퍼티 키를 동적 생성할 수 있다.
const obj={
[`${prefix}-${++i}`]:i,
[`${prefix}-${++i}`]:i,
[`${prefix}-${++i}`]:i,
};
console.log(obj); //{ 'prop-1': 1, 'prop-2': 2, 'prop-3': 3 }
ES5에서 메서드를 정의하려면 프로퍼티 값으로 함수를 할당한다.
//ES5
let obj={
name: 'andy',
hello: function(){
return 'hi my name is '+this.name;
}
};
console.log(obj.hello()); //hi my name is andy
ES6에서는 메서드를 정의할 때 function 키워드를 생략하면 축약 표현을 사용할 수 있다.
obj={
name: 'han',
hello(){
return 'hello';
}
};
console.log(obj.hello()); //hello