JavaScript에서 오버로드된 함수는 일반적으로 인수를 판단하여 작동합니다.
예:
var afunc = function() {
args = 인수;
if(args.length == 1) {
console.log(1)
}else if(args.length == 2) 🎜>console.log(2)
}else if (args.length == 3) {
console.log(3)
}
}
오버로드가 많을 때 if-else 판단이 얼마나 필요한지 짐작할 수 있습니다(실제로 오버로드 횟수가 너무 많으면 안 됩니다).
js 함수를 오버로드하려면 코드의 양이 분명 많아질 것입니다. 그렇다면 코드를 더 명확하게 만들고 동일한 코드 작성을 줄일 수 있는 방법을 찾을 수 있을까요?
이것이 제가 기사와 관련 코드를 작성한 이유입니다.
코드를 먼저 입력하는 것이 일반적입니다.
/**KOverLoad
오버로드된 함수를 생성하기 위한 도우미 메서드입니다.
사실 이 방법은 매개변수가 다를 때 오버로드된 메서드를 분류하는 데 도움이 됩니다.
그래도 매개변수 유형을 판단하고 오버로드하고 싶다면 제공된 방법으로 직접 구현해 보세요.
@작성자 ake 2010-05-02
@weblog http://www.cnblogs.com/akecn
*/
var KOverLoad = function(scope) {
this.scope =scope || window; //기본적으로 이 개체에 메서드를 추가합니다. 동시에 추가된 메소드의 this는 객체를 가리킨다.
this.list = {}; //오버로드된 함수를 저장하는 장소입니다.
return this;
};
KOverLoad.prototype = {
//오버로드된 메서드를 추가합니다.
//@param arg 메소드가 오버로드되었습니다.
add:function(arg) {
if(typeof arg == "function") {
this.list[arg.length] = arg; //매개변수 개수로 식별되는 스토리지 오버로드 메서드. 당연히 오버로드된 메서드의 매개변수 개수가
}
return this;
},
//오버로드된 함수를 모두 추가한 후 이 메서드를 호출하여 오버로드된 함수를 만듭니다.
//@param fc 오버로드된 함수의 메서드 이름입니다.
load:function(fc) {
var self = this, args, len;
this.scope[fc] = function() { //지정된 범위의 지정된 메소드를 오버로드된 함수로 설정합니다. .
args = Array.prototype.slice.call(arguments, 0); //매개변수를 배열로 변환합니다.
len = args.length;
if(self.list[len]) { //매개변수 개수에 따라 해당 오버로드된 메서드를 호출합니다.
self.list[len].apply(self.scope, args); //여기서 범위와 매개변수를 지정합니다.
}else{
throw new Error("정의되지 않은 오버로드 유형");
}
}
}
}
사용 방법 is me 내 생각에 더 명확한 방법은 다음과 같습니다.
//선택적 작업 개체입니다.
var s =function(){}
s .prototype = {
init:function() {
console.log();
}
}
//생성자의 매개변수는 Object 유형이거나 다른 합법적인 유형이어야 합니다. 지정하지 않으면 window 객체에 등록되고 범위도 window가 됩니다. 사실 어딘가에 오버로드된 메서드를 추가하기만 하면 됩니다.
new KOverLoad(s.prototype).add (function( a) {
console.log("one",a,this)
})
.add(function(a,b) {
console.log("two", a,b ,this)
})
.add(function(a,b,c) {
console.log("3",a,b,c,this)
})
.add(function(a,b,c,d) {
console.log("four",a,b,c,d,this)
})
.load(" func") ; //여기서 매개 변수는 생성할 오버로드된 함수의 메서드 이름입니다.
위 작업을 완료한 후 s.func는 오버로드된 함수입니다.
오버로드된 함수를 다음과 같이 호출할 수 있습니다.
var t = new s();
t.func();//오류 예외를 발생시킵니다. 0개의 매개변수로 지정된 함수가 없기 때문에
t.func("o");//one o Object {}
t.func(1,2);//two 1 2 Object {}
간단한 코드일 뿐입니다. 제안이나 의견이 있으시면 메시지를 남겨주세요.