17-5. Object 오브젝트(ES5 기준) / 프로퍼티 추출
getPrototypeOf()
구분 | 데이터(값) |
---|---|
object | Object 오브젝트 |
파라미터 | 대상 인스턴스 |
반환 | 프로퍼티 |
파라미터의 prototype에 연결된 프로퍼티 반환
function Book(point) { this.point = point; } Book.prototype.getPoint = function () {}; Book.prototype.setPoint = function () {}; var obj = new Book(100); var result = Object.getPrototypeOf(obj); for (var key in result) { console.log(key + ":" + result[key]); } // getPoint: function(){} // setPoint: function(){}
- 파라미터에 인스턴스를 작성합니다.
- 인스턴스를 생성항 function 오브젝트의 prototype에 연결된 프로퍼티를 반환
- 생성자 함수인 Book을 작성하거나 Book.prototype을 작성하면 반환하지 않습니다.
- this.point는 prototype에 연결되어 있지 않으므로 반환되지 않습니다.
참고
- setPrototypeOf()가 ES5 스펙에 없고 ES6에 있음
get
이 있으면 set
이 있어야됩니다.
설정도 안했는데 불러오는 것은 이상하지 않습니까?
그리고 반대로 set
이 있으면 get
이 있어야됩니다.
get
이 없는데 set
만 하는건 이상하잖아요?
즉, get
과 set
은 하나의 짝입니다.
물론 get
이 2~3개있고, set
은 하나만 있을 수도 있습니다.
그 반대일 수도 있습니다.
set
을 두 개로 분할해서 한 다음에 하나의 get
으로 가져올 수 있는 겁니다.
그런데 ES5 스펙에 setPrototypeOf
가 없습니다.
이것 때문에 예전에 한참 헤맸던 적이 있습니다.
get
이 있으면 set
이 있어야된다라는 것은 일반적이 통념입니다.
setPrototypeOf
: 인스턴스.proto 이 부분에 설정합니다.
getPrototypeOf
는 prototype에 있는 것을 가지고 오는데, setPrototypeOf
은 prototype이 아니라 __proto__에 설정합니다.
음..? 이것도 이상한데.. 그리고 왜 ES5에서는 setPrototypeOf
이것을 할 수 없었을까요?
__proto__
는 ES5 기준에선 표준이 아닙니다.
물론 브라우저에서는 지원을 했지만, ES5에 정의가 안되어있습니다.
그런데 ES6에 정의가 되어있습니다.
ES5에서setPrototypeOf
을 사용한다는 것은__proto__
에 설정한다는 것입니다.
즉, 이렇다할 표준이 없었기 때문에setPrototypeOf
를 ES5에서 사용할 수 없었다고 생각합니다.
getOwnPropertyNames()
구분 | 데이터(값) |
---|---|
object | Object 오브젝트 |
파라미터 | 대상 오브젝트 |
반환 | [프로퍼티 이름] |
- 오브젝트의 프로퍼티 이름을 배열로 반환
- 열거 가능 여부를 체크하지 않음
이것이 포인트입니다.
enumerable
을 체크하지 않습니다. 자신이 만든 프로퍼티가 대상
다른 오브젝트에서 받은 프로퍼티는 제외
var obj = {}; Object.defineProperties(obj, { // enumerable: true를 작성하지 않았으므로 디폴트값 false입니다. book: {value: "책"}, point: {value: 123} }) var names = Object.getOwnPropertyNames(obj); for (var k = 0; k < names.length; k++) { console.log(names[k]); } // book // point
getOwnPropertyNames
는 열거가능 여부를 체크하지 않습니다.
keys()
구분 | 데이터(값) |
---|---|
object | Object 오브젝트 |
파라미터 | 대상 오브젝트 |
반환 | 프로퍼티 이름 |
열거 가능 프로퍼티 이름 반환
enumerable: true
var obj = {}; Object.defineProperties(obj, { book: { value: "책", enumerable: true }, point: { value: 123 } }) var names = Object.keys(obj); for (var k = 0; k < names.length; k++) { console.log(names[k]); } // book
- point는 enumerable: false이므로 반환되지 않음
getOwnPropertyNames
와 keys
는 enumerable에서 차이가 있다.