ES6 (6)

Y·2020년 10월 12일
0

ES6

목록 보기
6/6

Object


ES6는 객체의 __proto__ 프로퍼티를 표준화하였고, 전역 Object 객체에 새로운 프로퍼티를 추가했다.

__proto__


JavaScript 객체는 객체의 프로토타입을 참조하는 [[prototype]] 프로퍼티를 내부에 지니고 있으며 이는 상속하는 객체의 프로토타입이다. 해당 프로퍼티를 읽기 위해서는 기존에 Object.getPrototypeOf() 을 사용했으며, 주어진 프로토타입을 프로토타입으로 갖는 객체를 생성하기 위해서 기존에는 Object.create() 메서드를 사용했다. [[prototype]] 프로퍼티는 직접적으로 읽거나 수정할 수 없다.

상속은 [[prototype]] 프로퍼티의 본질 때문에 굉장히 모호한 개념이었고, 프로토타입을 좀 더 효율적으로 사용하기 위하여 몇몇의 브라우저에서는 특별한 __proto__ 프로퍼티를 객체에 추가하였으며, 이는 객체 내부의 [[prototype]]을 드러내기 위한 접근자로서 사용했다.

기존 ES5 에서는 __proto__ 프로퍼티가 표준화되지 않았었지만, 이러한 대중성에 힘입어 ES6 에서는 표준화 되었다.

//In ES5
var x = {x: 12};
var y = Object.create(x, {y: {value: 13}});

console.log(y.x); //Output "12"
console.log(y.y); //Output "13"

//In ES6
let a = {a: 12, __proto__: {b: 13}};

console.log(a.a); //Output "12"
console.log(a.b); //Output "13"

Object.is(value1,value2)


Object.is() 메서드는 2개의 값이 일치하는지 아닌지를 판단한다. === 연산자와 비슷하지만, Object.is()메서드는 조금 더 특별한 케이스가 존재한다. 다음 예시를 보자.

console.log(Object.is(0, -0));
console.log(0 === -0);
console.log(Object.is(NaN, 0/0));

console.log(NaN === 0/0);
console.log(Object.is(NaN, NaN));
console.log(NaN ===NaN);

//Output
false
true
true
false
true
false

Object.setPrototypeOf(object, prototype)


Object.setPrototypeOf() 메서드는 객체에[[porototype]] 프로퍼티를 할당하는 하나의 방법이다. 예시를 보자.

let x = {x: 12};
let y = {y: 13};

Object.setPrototypeOf(y, x)

console.log(y.x); //Output "12"
console.log(y.y); //Output "13"

Object.assign(targetObj, sourceObjs...)


Object.assign() 메서드는 enumerable 한 모든 고유 프로퍼티들을 하나 또는 여러 객체에서 가져와 targetObj에 값을 복사해넣기 위해 사용된다. 이 메서드는 targetObj를 반환한다. 예시를 보자.

let x = {x: 12};
let y = {y: 13, __proto__: x};
let z = {z: 14, get b() {return 2;}, q: {}};

Object.defineProperty(z, "z", {enumerable: false});

let m = {};

Object.assign(m, y, z);
console.log(m.y);
console.log(m.z);
console.log(m.b);
console.log(m.x);
console.log(m.q == z.q);

//Output
13
undefined
2
undefined
true

Object.assign() 메서드 사용에 있어서는 주의할점이 있다.

  • sourceObjsgetters 를, targetObjsetters를 호출한다.

  • targetObj에 존재하는 기존의 프로퍼티 또는 새로운 프로퍼티에 소스 프로퍼티의 값을 할당한다.

  • sourceObj[[prototype]]을 카피하지 않는다.

  • JavaScript의 프로퍼티 명은 string 또는 symbol이며, Object.assign()은 모두 복사한다.

  • 프로퍼티 설명자(Descriptor) 및 정의는 카피되지 않으며, 따라서 Object.getOwnPropertyDescriptor(), Object.defineProperty()를 사용해야 한다.

  • null , undefined 를 값으로 가지는 프로퍼티는 무시된다.

profile
연세대학교 산업공학과 웹개발 JavaScript

0개의 댓글