-
2021_12_17 Deep_Dive 10장 객체 정리IT/js 2021. 12. 17. 02:18
총평 :
프로퍼티 동적 생성할려면 대괄호([...]) 이용
프로퍼티에 들어올 수 있는 값은 모든 값을 통칭한다 함수도 값이다
프로퍼티에 들어가는 함수는 메서드라고 부른다.
프로퍼티 안에 있는 변수와 값을 key와 value 라고 부른다
key는 'power-name' 이런식으로 지어도 되는데 따옴표 붙여야한다.
['name'] 처럼 프로퍼티 키값을 가져올때 대괄호 이용가능한테 따옴표 붙여야한다.
1. 객체란?
js는 객체 기반의 프로그래밍 언어이다.
js를 구성하는 거의 모든 것이 객체
원시 값을 제외한 나머지 값(함수, 배열, 정규 표현식 등)은 모두 객체다.
원시 타입은 단 하나의 값
원시타입의 값, 즉 원시 값은 변경 불가능한 값
객체 타입은 다양한 타입의 값(원시 값 또는 다른 객체)을 하나의 단위로 구성한 복합적인 자료구조
객체 타입의 값, 객체는 변경 가능한 값이다.
객체는 0개 이상의 프로퍼티로 구성된 집합이며, 프로퍼티는 키(key)와 값(value)로 구성된다.
var person ={ name: 'Lee', age: 20 };괄호 안에있는 것들이 프로퍼티
age, name 이 프로퍼티 key
20, 'Lee' 프로퍼티 값(value)
js에서 사용할 수 있는 모든 값은 프로퍼티 값이 될 수 있다.
js 함수는 일급 객체이므로 값으로 취급할 수 있다.
따라서 함수도 프로퍼티 값으로 사용할 수 있다.
// 삼단논법
모든 값 = 프로퍼티
함수 = 일급 객체 = 값
함수(메서드) = 프로퍼티
프로퍼티 값이 함수일 경우, 일반 함수와 구분하기 위해 메서드라 부른다.
var counter ={ num: 0, // 프로퍼티 increase: function(){ // 메서드 this.num++; } };프로퍼티로 있는 함수는 메서드라 부른다.
이처럼 객체는 프로퍼티와 메서드로 구성된 집합체, 프로퍼티와 메서드의 역할은 다음과 같다.
프로퍼티 : 객체의 상태를 나타내는 값(data)
메서드: 프로퍼티를 참조하고 조작할 수 있는 동작
이렇게 객체는 프로퍼티와 프로퍼티 참조, 조작하는 포함할 수 있기 떄문에 상태와 동작을 구조화 하기 유용함
js객체는 함수와 밀접한 관계. 함수를 객체로 생성하기도 하며 함수 자체가 객체이기도 함
js에서 함수와 객체는 분리해서 생각할 수 없는 개념
객체를 이해해야 함수를 이해하고 함수를 이해해야 객체를 이해할 수있음
2. 객체 리터럴에 의한 객체 생성
c++나 자바 같은 클래스 기반 객체지향 언어는 클래스를 사전에 정의하고 필요한 시점에 new 연산자와 함께 생성자를 호출하여 인스턴스 생성하는 방식으로 객체 생성
인스턴스란?
인스턴스란 클래스에 의해 생성되어 메모리에 저장된 실체
객체는 클래스와 인스턴스를 포함한 개념
클래스는 인스턴스를 생성하기 위한 템플릿
js는 프로토타입 기반 객체 지향 언어로써 클래스 기반 객체지향과는 달리 다양한 객체 생성 방법 지원
- 객체 리터럴
- Object 생성자 함수
- 생성자 함수
- Object.create 메서드
- 클래스(ES6)
이런 방법 중에서 가장 일반 적인건 객체 리터럴 사용하는 방법
*리터럴은 사람이 이해할 수 있는 문자 또는 약속된 기호를 사용하여 값을 생성하는 표기법
객체 리터럴은 객체를 생성하기 위한 표기법
var person = { name: 'Lee', sayHello: function(){ console.log(`Hello! My name is ${this.name}.`); } }; console.log(typeof person); // object consol.log(person); // {name: "Lee", sayHello: f}만약 중괄호 내에 프로퍼티를 정의하지 않으면 빈객체 생성
var empty = {}; // 빈객체 console.log(typeof empty); // object객체 리터럴 중괄호는 코드 블록을 의미하지 않는다.
코드 블록의 닫는 중괄호 뒤에는 세미 클론을 붙이지 않는다.
하지만 객체 리터럴은 값으로 평가되는 표현식
따라서 객체 리터럴의 닫는 중괄호 뒤에는 세미콜론을 붙인다.
객체 리터럴은 js의 유연함과 강력함을 대표하는 객체 생성 방식
객체를 생성하기 위해 클래스를 먼저 정의하고 new연산자와 함께 생성자를 호출할 필요가 어ㅏㅄ다.
숫자 값이나 문자열을 만드는 것과 유사하게 리터럴로 객체를 생성
객체 리터럴에 프로퍼티를 포함시켜 객체를 생성함과 동시에 프로퍼티를 만들 수도있고
객체를 생성한 이후에 프로퍼티를 동적으로 추가할 수 있다
객체 리터럴 외의 객체 생성 방식은 모두 함수를 사용해서 만듬
3. 프로퍼티
객체는 프로퍼티의 집합이며 프로퍼티는 키와 값으로 구분
프로퍼티 나열할떄는 쉼표(,)로 구분
프로퍼티 키는 프로퍼티 값에 접근할 수 있는 이름, 식별자 역할
식별자 네이밍 규칙을 준수하는 키와 그렇지 않은 키는 미묘한 차이 있음
심벌 값도 프로퍼티 키로 사용할 수 있지만 일반적으로 문자열 사용
식별자 네이밍 규칙을 따르지 않는 이름에는 반드시 따옴표 사용
설명 보단 예시로 식별자는 last-name 이라는 키값을 가질 수 없지만 'last-name' 으로 하면 가능하긴하다.
빈 문자열도 키로 사용할 수 있음
키값이 같을경우 하단의 키의 값이 상단의 키의 값을 덮어쓴다.
4. 메서드
js에서 모든 값은 프로퍼티로 사용가능
js 함수는 객체 이므로 프로퍼티로 사용가능
프로퍼티로 사용하는 함수를 메서드라고 부른다.
메서드 내부에서 사용한 this 키워드는 객체 자신을 가리키는 참조변수
5. 프로퍼티 접근
프로퍼티에 접근하는 방법은 다음과 같이 두 가지다.
마침표 프로퍼티 접근 연산자(.)를 사용하는 마침표 표기법
대괄호 프로퍼티 접근 연산자[...]를 사용하는 대괄호 표기법
프로퍼티 키가 식별자 네이밍 규칙을 준수하는 이름이면 마침표든 대괄호든 사용가능
대괄호 표기법을 사용하는 경우 대괄호 프로퍼티 접근 연산자 내부에 지정하는 프로퍼티 키는 반드시 따옴표로 감싼 문자열이어야 한다. 안그러면 식별자로 인식한다.
객체 내부에 존재하지 않는 프로퍼티에 접근 할경우 - undefined
객체 내부에 존재하나 식별자로 인식할 경우 -= ReferenceErro
단, 프로퍼티 키가 숫자로 이뤄진 문자열인 경우 따옴표 생략가능
6. 프로퍼티 값 갱신
이미 존재하는 프로퍼티 값을 할당하면 프로퍼티 값이 갱신
var person = { name: 'Lee' }; person.name = 'Kim'; console.log(person); // {name: "Kim"}이렇게 덮어 씌워진다.
7. 프로퍼티 동적생성
var person = { name: 'Lee' }; person.age = 20; console.log(person); // {name: "Kim", age:20}동적 생성가능
8. 프로퍼티 삭제
delete 연산자는 객체의 프로퍼티를 삭제
이때 delete 연산자의 피연산자는 프로퍼티 값에 접근할 수있는 표현식이어야 한다.
var person = { name: 'Lee' }; person.age = 20; delete person.age; delete person.address; // 무시, 에러반환 없음 console.log(person); // {name: "Kim"}있는건 제거할 수 있는데
없는건 제거한다고 해도 에러안남
9. ES6에 추가된 객체 리터럴 확장 기능
9.1. 프로퍼티 축약 표현
//ES5 var x = 1, y = 2; var obj = { x: x, y: y }; console.log(obj) // {x :1, y:2} //ES6 let x = 1, y = 2; // 프로퍼티 축약 표현 const obj = { x, y }; console.log(obj); // {x: 1, y: 2}ES6에서는 프로퍼티 값으로 변수를 사용하는 경우 변수 이름과 프로퍼티 키가 동일한 이름일 때 프로퍼티 키를 생략 할 수 있음
9.2. 계산된 프로퍼티 이름
문자열 또는 문자열 타입 변환할 수있는 값으로 평가되는 표현식을 사용해 프로퍼티 키를 동적으로 생성할 수 있다.
프로퍼티 키로 사용할 표현식을 대괄호로 묶어야한다. 이렇게 계산된걸 프로퍼티 이름이라 한다.
ES5에서 계산된 ㅋ프로퍼티 이름을 ㅗ프로퍼티 키를 동적 생성하려면 객체 리터럴 외부에서 대괄호 표기법을 사용해야 한다.
결론 -
객체 내부에서도 동적으로 생성가능 하고 객체 외부에서도 프로퍼티를 동적으로 생성가능한데
그렇게 생성할려면 무조건 대괄호로 묶어야한다.
9.3. 메서드 축약 표현
ES5 에서 메서드 정의하려면 프로퍼티 값으로 함수를 할당한다.
ES6 에서 메서드 정의할떄 function 안써도 된다. 근데 축약 표현으로 정의한건 일반 메서드와 다르게 동작한다.
끝
'IT > js' 카테고리의 다른 글
2021_12_20 Deep_Dive 24장 클로저(closure) (0) 2021.12.20 2021_12_17 Deep_Dive 11장 원시 값과 객체의 비교 (0) 2021.12.18 2021_12_14 생성자 함수에의한 객체 생성 (0) 2021.12.14 2021_12_08 윤년계산 알고리즘 (0) 2021.12.08 2021_12_07 변수의 생명주기 (0) 2021.12.07