이유는 이렇다.
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
좋지 아니한가?
댓글
댓글 쓰기