Object Opreation
Object에 같은 프로퍼티 키 사용
변수 이름이로 프로퍼티 값 설정
Object에 function 작성
let sameKey = {key: 1, key:2};
ES3 키가 같아도 추가됨
ES5 strict 모드는 키가 같으면 에러
ES6 은 뒤에것으로 덮어짐
변수 이름으로 프로퍼티 값 설정
let one = 1, two =2
let pp = { one, two};
decriptor
ES5
프로퍼티 디스크립터
속성 이름, 속성 값으로 구성
프로퍼티 속성 정의
프로퍼티 디스크립터 타입 분류
데이터 프로퍼티 디스크립터
acceess 프로퍼티 디스크립터
var obj = {};
Object.defineProperty(obj,”book”, {
value : 123,
enumerable : true
});
프로퍼티 디스크립터 타입 인식기준
- 먼저 value와 writable 속성 체크
es5 getter
- get 속성
var obj = {};
Object.defineProperty(obj, “book”, {
get: function(){return “책;" }
}
var result = obj.book;
getter
obj.book; 코드를 만나면
obj.book의 get()을 자동으로 호출
obj.book.get()으로 호출하면 에러 발생
es5 setter
- set 속성
var obj = {sports:”축구”};
Object.defineProperty(obj, “item”, {
set: function(param){this.sports = param; }
}
obj.item = ‘농구" ;
setter
obj.item ; 코드를 만나면
obj.item.set()을 자동으로 호출
ES6 getter
var obj = {
value:123,
get getTotal(){
return this.value;
}
obj.getTotal;
getTotal앞에 obj 실행
ES6 setter
var obj = {
set setTotal(){
thi.value =123,
}
obj.setTota();
is()
두개의 파라미터 값과 값 타입 비교
- 같으면 true, 아니면 false 반환
오브젝트 비교는 아님
[]과 [], {}과 {} 비교는 false
단, window 오브젝트 비교는 true
javascript 값비교 방법
=== 값과 타입
== 값만
Object.is() 값과 타입
===, Object.is() 차이
+0,-0 비교
=== true, Object.is() false
NaN 과 NaN 비교
=== false, Object.is() true
assign()
두번째 파라미터의 오프젝트 프로퍼티를
첫 번째 파라미터의 오브젝트에 복사하고
첫 번째 파라미터 반환
첫번째 파라미터에 열거 가능한 Object 지정
- 미지정, undefined, null 이면 Type Error
두번째 파라미터에 복사할 오브젝트 지정
열거 가능한 오브젝트 지정
own property만 복사
[[prototype]] 복사 안함
프로퍼티 디스크립터 복사안함
두번째 파라미터를 지정하지 않으면 첫번째 파라미터로 반환
let obj = Object.assign(123,45);
두번째 파라미터가 열거가능한 오브젝트가 아니면 복사 안함
Object를 할당하면 프로퍼티가 연동됨
- 한쪽의 프로퍼티값을 바꾸면 다른 곳도 바뀜
연동되지 않게 하려면 별도 처리 필요
let a = {a1: “1”, a2: “2”}
let b = {}
b = a // 값변동시 연동됨
그래서
for (var key in a){
b[key] = a[key];
};
하지만 assign 사용하면 프로퍼티 값 연동 방지
let b = Object.assign({}.a);
setPrototypeOf()
첫번째 파라미터의 prototype에 두번째 파라미터 설정
첫번째 파라미터 작성 기준
오브젝트, 인스턴스 지정
오브젝트가 프로퍼티 추가 붙가이면 TypeError
Boolean, Number, String, Symbol이면
두번째 파라미터를 설정하지 않음
ES5에 getPrototypeOf() 있음
자바스크립트 sharing
- 객체
두번째 파라미터 작성 기준
오브젝트와 prototype 지정
function, 인스턴스도 가능하지만 목적기능에 부합하지않음
__proto__
protoype은 모든 인스턴스에 공유
인스턴스를 생성하면 오브젝트의 prototype에 연결된 프로퍼티가 인스턴스의 __proto__ 첨부됨
__proto__ 의 메서드를 호출하면 오브젝트.prototype의 메서드가 호출됨
__proto__ 계층구조를 만듬
__proto__ : 엔진 영역
getter, setter
__proto__ 에 function 추가
__proto__ 에추가되지 않고
오브젝트의 prototype 에 추가됨(setproperty 사용하면됨)
모든 인스턴스에서 공유 할 수 있도록 연결
__proto__ 엔진이 사용
그 동안 스펙에 없는데 브라우저에서 지원
스펙의 부록에 __proto__ 가 작성되어있음
사용하지말라는 뉘앙스가 강함
오브젝트와 할당된 객체 사이에 prototype을 이용하여 공유된다
오브젝트에 prototype에 set하면 할당된 객체 에서 호출됨