console.log(
[1,2,3,4].map(function(val){
return val * 2;
})
);
// 2,4,6,8 출력
console.log(
[1,2,3,4].filter(function(val){
return val % 2;
})
);
// 1,3 출력
다형성에 대해 얘기하기전에 기존에 만들었던 _map 함수와 _filter 함수는 이미 만들어져있다.
그래서 위와같이 사용이 가능하다.
명확히는 함수가 아닌 메서드로 만들어져있다.
무슨말이냐면 메서드는 어떤 객체, 여기서는 배열의 메서드라서 배열객체가 생성된 후에 그 배열객체에'만' 적용가능한 함수인 것이다.
console.log(
document.querySelectorAll('*').map(function(node){
return node.nodeName;
});
);
이렇게 찍어보면 어떨까?
document.querySelectorAll('*') 만 콘솔로 찍어보면 마치 배열처럼 [head, script, body, ... ] 이런식으로 나온다.
length도 보이고 배열의 인덱스도 보이지만 배열이 아니다.
이것은 array like 타입이기 때문에 위의 콘솔은 에러가 난다.
배열의 함수인 map을 불러서 그렇다.
이 문제를 어떻게 해결하느냐? 전에 만든 _map과 _filter는 함수다.
즉, 어떤 객체에'만' 적용가능한 메서드가 아닌 함수라서 그 함수의 인자에 타입만 맞으면 모두 실행가능하다(외부 다형성)
이렇게 함수를 사용하면 외부적으로 다형성을 만들 수 있다는 얘기다. (_map, _filter, _each가 핵심 조건)
그럼 내부적으로 다형성은 누가 만들까?
바로 iter, mapper, predi 같은 인자로 넘어오는 함수들이다.
_map([1,2,3,4], function(v){
return v + 10;
});
그 배열에 어떤 값이든 수행할수 있게 만드는 역할은 보조함수가 하며, 그 인자로 들어오는 보조함수로 내부 다형성을 구현함.
개발자가 v가 숫자니까 더할꺼라든지 node가 노드니까 그 이름을 리턴한다든지 보조함수를 통해 정한다.
참고