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()
메서드는 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()
메서드는 객체에[[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()
메서드는 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()
메서드 사용에 있어서는 주의할점이 있다.
sourceObjs
의 getters
를, targetObj
의 setters
를 호출한다.
targetObj
에 존재하는 기존의 프로퍼티 또는 새로운 프로퍼티에 소스 프로퍼티의 값을 할당한다.
sourceObj
의 [[prototype]]
을 카피하지 않는다.
JavaScript의 프로퍼티 명은 string
또는 symbol
이며, Object.assign()
은 모두 복사한다.
프로퍼티 설명자(Descriptor) 및 정의는 카피되지 않으며, 따라서 Object.getOwnPropertyDescriptor(), Object.defineProperty()
를 사용해야 한다.
null
, undefined
를 값으로 가지는 프로퍼티는 무시된다.