왜 object에 prototype을 쓰지 않나? 버닝!!

http://triin.net/2009/09/13/Why_exactly_is_Object.prototype_verboten

이유는 이렇다.
prototype 에 method 를 정의하면
자기 자신도 해당 object 에 카운트가 된다.

무슨말이냐?
object (array포함) 의 key와 value를 보기 위해 종종 아래와 같이 해본다.
var ages = {  John: 10,  Mary: 28,  Alice: 16};
일때
(function(obj){ for (idx in obj) { console.log(idx+':'+obj[idx]) }})(ages) 
이렇게 떠 보면
John:30
Mary:30
Alice:30
뭐 이렇게 나오겠지.

그럼 아예 object 에 이걸 prototype 해서 그냥 method 로 만들지 싶어

Object.prototype.printObject=function(){ for (idx in this) { console.log(idx+':'+this[idx]) }};
요따우로 해주면

ages.printObject()
> John:10
> Mary:20
> Alice:30
> printObject:function (){ for (idx in this) { console.log(idx+':'+this[idx]) }}

망한다.
다시 이야기 하지만 자기 자신도 객체의 일부가 되니까.
그래서 쓰지말라는 것이다.

hasOwnProperty를 사용해서 피해가는 방법도 있겠지만 다른 문제가 있다.
자세한 설명은 생략한다. 왜 그런지 알고 싶으면 본문 봐라. (난 알고싶지 않아서 안봤다. 안쓸거니까 우왕ㅋ)

결론은 이거다.
defineProperty 를 사용하자.
ECMAScript 5 스펙이다. 하지만 망할 IE7 에선 안되겠지
http://ejohn.org/blog/ecmascript-5-objects-and-properties/ (꼼꼼히 읽어볼 필요가 있다)
사용법이 좀 뜨억함.

Object.defineProperty(Object.prototype, "printObject", {
  value: function() {
    for (idx in this) { console.log(idx+':'+this[idx]) }
  }
});

이런식으로 쓰면 된다.
console.log 를 찍은 삽질을 해도 이해바란다.

---------- 보너스 ---------
get 으로 합을 구해보자.
array 형인 경우 length 라는 property 가 있어서 항상 갯수를 반환한다.
length() 가 아니고 length 로 말이다.

[10,20,30].length() <- 이게 아니다.
[10,20,30].length <- 요거

그렇다. getter를 정의한 것이다. 그럼 sum이 getter 로 선언하면 되는데.

일단 sum은 어떻게 구하는가?
reduce를 사용해본다. noSQL! 하고 외친다면 당신이 생각하는 그것이 맞다고 말해주고 싶다.

var ages = [10,20,30];
ages.reduce(function(sum,val) { return sum+val; });
> 60

Object.defineProperty(Object.prototype, "sum", {
  get: function() {
    return this.reduce(function(sum,val) { return sum+val; });
  }
});

ages.sum
> 60

좋지 아니한가?

덧글

댓글 입력 영역