객체는 총 4종류가 있다.
객체를 사용하기 위해서는, 메모리 위에 객체가 올라가야한다._
이렇듯 메모리 위에 올라가 사용할 수 있는 객체의 상태를 인스턴스라고 한다.
new 객체명 //메모리 위에 새로올리는 법 : new
var arr=new Array(4); //배열의 크기를 지정O
var arr2=new Array(); //배열의 크기를 지정X
var arr=[1,2,3];
객체 생성 시 파스칼 네이밍을 사용한다
let obj1 = new Object;//new 다음 파스칼 사용
console.log(typeof obj1); //object
let obj2 = {name:'IT', age: 28};
//선언식
function Customer(){
}
let customer = new Customer();
console.log(customer); //object가 아니라 customer이라고 뜬다.
//표현식
let customer2 = function(){};
사용자가 직접 객체 형태를 만드는 방법이다.
function Car(){
brand = '포르쉐';
}
let car = new Car();
console.log(car); //이러면 brand 프로퍼티가 보이지 않는다?
이 경우에는 마지막줄의 car의 property가 제대로 보이지 않는다.
왜냐면, 생성자 함수 안에서 '생성할 객체가 가질 프로퍼티'라고 명시가 되어있지 않기 때문.
함수 표현식으로도 사용자 정의 객체 생성이 가능할까?
1) 일반적인 함수 표현식으로는 생성 가능
2) 화살표함수 표현식으로는 생성 불가능-> 화살표 함수는 this를 사용할 수 없기 때문!!
this는 생성자가 가지는 프로퍼티라고 명시를 하기 위해 사용된다.
function Car(){
//프로퍼티
this.brand = '포르쉐';
this.color = 'red';
//메서드
this.turnOn = function(){
console.log("turn On");
}
}
메서드는 물론 화살표 함수로도 표현이 가능하다.
...
this.turnOn=()=>console.log("turn On!!!");
console.log(car.brand)
.을 이용하면 객체가 가지고있는 프로퍼티에 접근이 가능하다.
console.log(car['brand']);
마치 배열의 인덱스로 접근하는 것 처럼, 꺾은 괄호를 이용해서도 표현이 가능하다.
이 때, 프로퍼티명은 문자열('')로 표현해야한다.
이 때 프로퍼티(메서드)를 바꾸는 방법에는 두가지가 있다.
function Student(name,grade,id){
this.name = name;
this.grade = grade;
this.id = id;
//this.printInfo=()=>console.log(name, grade, id);
this.printInfo = function(){return `name: ${this.name}, grade: ${this.grade}, id : ${this.id}`}
}
let it = new Student('IT','Junior',1001);
it.id = 1010;
나중에 OOP를 배우게 되면 getter ,setter 등의 메서드로 안정성을 높이게 되는데
이와 유사하게 별도의 메서드를 만들면 된다.
function Student(name,grade,id){
this.name = name;
this.grade = grade;
this.id = id;
//this.printInfo=()=>console.log(name, grade, id);
this.printInfo = function(){return `name: ${this.name}, grade: ${this.grade}, id : ${this.id}`}
this.setId = function(newId){this.id = newId};
}
let it = new Student('IT','Junior',1001);
it.setId(1010);
이렇게 세부 기능별로 메서드를 쪼개야 재활용이 편하다!
프로퍼티의 제거는 delete를 이용한다. (delete 뒤에는 바로 객체프로퍼티명이 와야함)
//...위에 예제 그대로
delete it.grade;
console.log(it.printInfo()); //grade부분이 undefined가 뜬다
근데 이상하지 않은가?
grade는 이제 없는 프로퍼티인데, 왜 오류가 뜨는게 아니라 undefined가 뜬다.
이 때, 아예 해당 프로퍼티를 삭제한 새로운 객체를 만들어내는 문법이 있다.
let {grade, ...newStudent} = it;
console.log(newStudent);
위 문법은 it 객체에서 grade를 분해하고, 그 외 나머지(...) 프로퍼티들을, 'newStudent'라는 변수로 새로 할당한다는 이야기다.
delete
원본 객체 변경 가능
... (spread)
원본 객체 변경X, 새로운 객체 생성
선언식 말고도 표현식으로 객체 생성이 가능할까?