드림코딩 by 엘리 님의 자바스크립트 기초 강의를 보고 정리한 글입니다.
만약 js에 object가 없다면, 우리가 정의한 변수들이 여기 저기서 둥둥 떠다니면서 규모있는 프로젝트를 만들기 어려워 질 것이다.
class 는 fields
와 methods
로 구성되어 있다.
(attribute
, property
, field
의 차이가 뭘까 ..ㅋㅋ)
fields
로만 구성된 class를 data class
라고 한다.
js에서는 class가 ES6 부터 도입되었다.
그래서 그 전까지는 class를 정의하지 않고 바로 object를 만들었다.
또한 object를 만들때 function을 이용해서 template을 만드는 방식을 사용했다.
사실 그래서 ES6에서 class가 도입되고도 기존에 존재하던 prototype base에 기반해서
그 위에 간편하게 object를 만들 수 있도록 문법만 class가 추가된 것이다.
(이런 것을 syntactical sugar
라고 한다. 문법상으로만 존재하지만 편리함을 제공해줘서 달달하다는 뜻. ㅋㅋ)
그래서 js의 class를 완벽히 이해하려면 prototype에 대한 이해가 필요하다!
(근데 우선은 high level에서의 class를 쓰는 방법 부터 알아보자.)
- `this.data` 로 접근 할때는 자동으로 getter가 쓰이고
- `this.data = something` 로 값을 넣을때는 자동으로 setter가 쓰인다.
- 재귀적으로 계속 불러지는 것을 방지하기 위해서 field name에 '_' 를 추가해준다.
BABEL
을 이용해야 한다 ㅜinstanceof
연산자rectangle instanceof Rectangle
과 같이 사용할 수 있고 true
나 false
값을 리턴한다. rectangle instanceof Rectangle;
triangle instanceof Rectangle;
triangle instanceof Triangle;
triangle instanceof Shape;
triangle instanceof Object;
T T T T T
{}
new
const obj1 = {};// 'object literal' syntax
const obj2 = new Object(); // 'object constructor' syntax
object literal 방식 ({}
쓰는 방식) 을 쓰면 class를 굳이 정의하지 않고 객체를 만들 수 있다.
(key, value)
페어로 생각하면 된다.JS는 runtime에 type이 결정되는 dynamically typed language
이기 때문에 object의 property를 runtime에 추가
또는 삭제
할 수 있다.
obj.num = 4; // 오브젝트에 property 추가
delete obj.num; // 오브젝트에 property 삭제
객체의 property에 접근하는 2가지 방법이 있다.
obj.num
obj['num']
[]
안에는 string type 으로 key를 넣어야한다.항상 기존의 '.' 방식을 쓰고 computed property 방식을 쓸 수 밖에 없는 상황에서만 그걸 쓴다.
//computed property를 써야하는 상황
function printValue(obj, key) {
console.log(obj[key])
//console.log(obj.key) (X)
}
printValue(obj, 'num')
const person1 = mainPerson('hyeonseop', 25)
function makePersion(name, age) {
return {
name,
age,
};
/* 물론 이것도 가능함
return {
name: name,
age: age,
};
*/
}
constructor function
을 이용할 수도 있다. const person1 = new Person('hyeonseop', 25);
function Person(name, age) {
// this = {};
this.name = name;
this.age = age;
// return this;
}
constructor function
으로 인지하고 그 부분을 넣어준다.'name' in person1
true
or false
로 object안에 해당 키(property)가 있는지 검사한다.for ... in
반복문 vs for ... of
반복문for ... in
은 객체의 key
를 검색하기 위함.for ... of
는 iterable(배열)의 값
들을 순차적으로 검색하기 위함. for (key in person1) {
console.log(key)
}
// 출력 결과 : name age
const array = [1, 2, 4, 5];
for (value of array) {
console.log(value);
}
//출력 결과 : 1 2 4 5
const user1 = {name: 'hyeonseop', age: '20'};
const user2 = user1;
그래서 이 경우 user2의 내용을 변경할 경우 user1의 내용이 바뀐다.
(같은 곳을 참조하고 있기 때문)
const user1 = {name: 'hyeonseop', age: '20'};
const user2 = {}
for(key in user1) {
user2[key] = user1[key];
}
참고로 여기서 user2를 const
로 선언해도 객체 안의 데이터는 바꿀 수 있다.
(저 위의 사진을 잘 생각해보자)
const user1 = {name: 'hyeonseop', age: '20'};
const user2 = {}
Object.assign(user2, user1);
//or
const user3 = Object.assign({}, user1);
javascript에서 제공하는 APIs는 cmd + 클릭
을 통해서 해당 API의 선언부를 확인 가능하다!!
const person1 { gender: 'female'};
const person2 { gender: 'male', age: 25};
const mixed = Object.assign({}, person1, person2);
mixed.gender; //??
mixed.age; //??
male, 25
사실 javascript에서는 class(객체지향)
보다는 그냥 (key, value)
의 object
를 더 많이 쓰기때문에 객체지향에 대한 이해가 좀 부족해도 일단 넘어가자!
(근데 나중에 typescript할 때는 객체지향(class) 개념이 많이 쓰임)