{ key : value } 형식으로 속성(property)을 저장하는 컨테이너
* 참조 타입
객체는 크게 속성(프로퍼티), 메소드로 구성됩니다.
: 생성자 함수로 객체를 생성할 때는 반드시 new 연산자를 같이 써야한다.
var myObject = {name: '너의이름은'}
var exObj = new myObject();
: 객체를 쉽게 정의할 수 있도록 디자인된 표기법 (Object() 빌드인생성자함수 축약표현)
중괄호 { } 를 이용해서 객체를 생성, 데이터를 쉼표 ","로 구분
var exObj2 = { name: ‘jaen’, job: ‘developer’}
객체 리터럴은 같은 형태의 객체를 재생성할 수 없다.
프로토타입 객체(부모 타입 [[prototype]])가 다르다. :: 객체 생성 규칙
2.1 생성자 함수 : 생성자 함수의 property 객체를 참조
2.2 객체리터럴 : Object.prototype를 참조
var commaObj = {}; //담을 객체 먼저 생성!!!
commaObj.music = "If i can't have you";
console.log(commaObj); // {music: "If i can't have you"}
var squareObj = {};
squareObj["music-pop"] = "How do you sleep";
console.log(squareObj["pop-music"]); // "How do you sleep"
console.log(squareObj.pop-music); //Uncaught ReferenceError: pop is not defined or NaN (-연산자)
var delObj = {mind: "hello", age: null};
delete delObj.age; // {mind: "hello"}
객체 값을 비교할 때 참조값
을 비교한다는 것에 주의 해야한다.
let a = 'ab', b = 'ab';
let objA = {oba: 'oba'}, objB = {obb: 'obb'};
let objC = objA;
a == b; //true
objA == objB; //false
objA == objC; //true
//생성자 함수
function Person (pName) {
this.name = pName;
};
function Me(){
this.hobby = 'develop';
}
Me.prototype = Object.create(Person.prototype); // 상속
let obj = {name: "jaen", job: "developer", year: 2020}
Object.keys(obj); //["name","job","year"]
Object.values(obj); //["jaen","developer",2020]
let obj = {name: "jaen", date: 31}
let obj2 = {date: 27}
let obj3 = Object.assign({},obj,obj2); //obj3: {name: "jaen", date: 27}, obj: {name: "jaen",date: 31}, obj2: {date: 27}
let obj4 = Object.assign(obj,obj2); //obj4: {name: "jaen", date: 27}, obj: {name: "jaen", date: 27}, obj2: {date: 27}
let obj = {name: "jaen", job: "developer", year: 2020}
obj.hasOwnProperty('job'); // true
obj.hasOwnProperty('age'); // false
객체의 부모 역할하는 객체 === "프로토타입"
모든 객체는 자신의 부모 역할을 하는 객체(숨겨진 프로퍼티)와 연결되어 있다.
var obj = {};
//Object.create(prototype,{key…}:: 속성들) : 객체를 생성하는 메소드
var obj2 = Object.create(obj,{
inO1: {
writable: false, //writable: 속성 값 수정 가능 여부
enumerable: false, //enumerable :: 열거 가능 여부 (for-in 반복문 내 사용가능하는지)
configurable: false, //configurable: 속성 설명 변경 가능여부 :: 속성 재정의 X
value : 5
},
inO2 : {
enumerable: false, //enumerable :: 열거 가능 여부 (for-in 반복문 내 사용가능하는지)
configurable: false, //configurable: 속성설명 변경 가능여부 :: 속성 재정의 X
get: function () {return ‘inner object’},
set: function (param) {this.inO1 = param}
}
})
obj2.inOb1, obj2.inOb2; //5 'inner object’
obj2.inOb1 = 3; //But, value: 5 (becasue writable was false)
obj2.inOb2 = ‘wow'; //'inner object’ > 'set' method >(inObj1 : 5 :: writable)
Object.defineProperty(obj2, ‘inO2’, {value : ‘Yeah’}) //no change ( configurable was false_ :: 속성의 설명을 재정의 X
동등연산자 ==
피연산자의 값을 비교합니다.(타입이 다를 경우 타입변환 거치고..)
일치연산자 ===
피연산자의 타입까지 비교합니다. (타입변환 ❌)
1 == '1'; //true
1 === '1'; //false
피연산자를 불린값으로 강제 변환하는 것
!!'1'; //false
!!0; //true
lenght 속성을 가지는 객체
이다..! (배열 아니고 객체!!!)
객체임에도 불구하고 배열 표준 메소드 사용 가능 (push, pop...)