method borrowing 메소드 빌리기
객체의 메서드를 다른 객체의 프로퍼티로 참조할당하여 사용하는 방법
주로 내장객체 메소드는 해당 객체타입에 한해 메소드가 사용가능하도록 되어있다.
Array.prototype.join메소드는 배열메소드이기때문에 유사배열객체.join(',') 이렇게 사용할 수 없다.
속성접근자가 해당 메소드를 접근하기위한 타입검사를 수행한다.
let obj = {
0: "Hello",
1: "world!",
length: 2,
};
obj.join(','); // 첫번째 호출
obj.join = Array.prototype.join;
obj.join(','); // 두번째 호출
첫번째 join호출은 obj에 join프로퍼티가 없으므로 에러가 발생한다.
obj.join = Array.prototype.join; 구문으로 obj.join프로퍼티는 Array.prototype.join메소드를 참조하게되고 마치 내것처럼 사용이 가능하다.
join메소드는 인덱스 요소접근과 length속성만으로 구현되어있기 때문에 두번째 호출은 정상적으로 수행된다.
자바스크립트 내장객체들은 위와 같이 구현되어있는것들이 많으므로 해보거나 찾아서 알아놓는것도 좋다.
콜포워딩
func.call(context, ...args);
func.apply(context, args);
컨텍스트와 인수를 다른 함수에 전달하여 호출하는 것을 콜포워딩(call forwarding)이라고 한다.
모든 함수는 call, apply를 상속받기 때문에 콜포워딩이 가능하다.
이터러블메소드에 콜포워딩을 하면 유사배열객체도 사용이 가능한 경우가 많다.
let str = {
0:'a',
1:'b',
2:'c',
3:'d',
length:4
}
let ret = Array.prototype.join.call(str,'');
let ret = Array.prototype.join.apply(str,{0:'',length:1});
apply메소드는 두번째인자로 유사배열객체를 요구하기때문에 구조를 맞추어줘야 한다.
유사배열객체에 배열메소드, 이터러블메소드를 사용하는 방법