마침 인피니트 학생이 이 문제와 실제로 관련된 "더 우아한 호환성"을 제안했습니다(나중에 살펴보겠습니다)
youa 스크립트 라이브러리의 Helper of Function에 Supports를 추가하세요. 오버로드된 패턴 일치
/**
* 함수 매개변수에 대한 패턴 일치를 수행하는 함수 매개변수 오버로드 방법 오버로드입니다. 기본 디스패처는 * 및...을 지원하며, "*"는 모든 유형의 매개변수를 나타내고, "..."는 모든 유형의 여러 매개변수를 나타내며, "?"는 일반적으로 ",?..."에서 사용됩니다. 또는 임의 개수의 매개변수
* @method 오버로드
* @static
* @선택적 {dispatcher}는 매개변수 전달을 담당하는 함수를 일치시키는 데 사용됩니다.
* @param {func_maps}는 다음을 기반으로 호출을 허용합니다. 일치하는 함수 목록
* @return {function} 오버로드된 함수
*/
오버로드: function(dispatcher, func_maps) {
if (!(함수 디스패처 인스턴스)) {
func_maps = 디스패처;
dispatcher = function(args) {
var ret = [];
return map(args, function(o) {return getType(o)}).join()
}
}
return function() {
var key = dispatcher([].slice.apply(arguments));
for (var i in func_maps) {
var Pattern = new RegExp("^" i.replace("*", "[^ ,]*").replace("...", ".*") "$");
if (pattern.test(key)) {
return func_maps[i].apply(this, 인수);
}
}
};
},
FunctionH.overload에는 두 개의 매개변수가 포함되어 있으며, 하나는 일치 조건을 처리하는 디스패처 함수입니다. 지방), 다른 하나는 함수 매핑 테이블 세트입니다. 기본 디스패처 함수는 호출된 실제 매개변수 유형을 기반으로 문자열을 생성합니다. 예를 들어 호출된 세 매개변수는 10, "a" 및 [1,2]입니다. "number", string, array"를 생성합니다. 패턴 매칭을 구현할 때 함수 매핑 테이블의 각 "키"를 기반으로 정규식이 생성됩니다. 이 정규식은 디스패처 함수의 반환 값을 일치시키는 데 사용됩니다. 일치하면 해당 키가 호출됩니다. 그렇지 않으면 다음 키를 순서대로 일치시킵니다. 예:
getEx: function(obj, prop, returnJson) {
var ret, propType = ObjectH.getType(prop)
if (propType == ' array') {
if (returnJson) {
ret = {}
for (var i = 0; i & lt; prop.length; i ) {
ret[prop[i] ] = ObjectH.getEx(obj, prop[i]);
}
} else {
//getEx(obj, props)
ret = []
for (var i = 0; i & lt; prop.length; i ) {
ret[i] = ObjectH.getEx(obj, prop[i])
}
} else {
//getEx(obj, prop)
varkeys = (prop "").split(".");
ret = obj
for (var i = 0; i & lt;keys .length; i ) {
ret = ret[keys [i]];
if (returnJson) {
var json =
json[prop] = ret;
return json;
}
}
return ret
},
위의 경우 "악"은 다음과 같이 최적화될 수 있습니다. >
" *,array,*": function(obj, prop, returnJson) {
if (returnJson) {
ret = {};
for (var i = 0; i & lt; prop.length; i ) {
ret[prop[i]] = ObjectH.getEx (obj, prop[i]);
}
} else {
ret = []
for (var i = 0; prop.length; i ) {
ret[i] = ObjectH.getEx(obj, prop[i])
}
return; 🎜>},
"*,string,*": function( obj, prop, returnJson) {
varkeys = (prop "").split(".")
ret = obj;
for (var i = 0; i & lt;keys.length ; i ) {
ret = ret[keys[i]]
}
if (returnJson) {
var json = {};
json[prop] = ret;
return json;
}
return ret;
좋아, 어떤 사람들에게는 이 형식이 원본보다 조금 더 좋아 보일 수도 있지만 실제로는 더 나아갈 수 있습니다. -
코드 복사
코드는 다음과 같습니다.
getEx: FunctionH.overload(function(args) {
return "prop is " ObjectH.getType(args[1]);
},{
"prop is array": function(obj, prop, returnJson) {
if (returnJson) {
ret = {}
for (var i = 0; i & lt; prop.length; i ) {
ret [prop[i]] = ObjectH.getEx(obj, prop[i]);
}
} else {
//getEx(obj, props)
ret = []; >for (var i = 0; i & lt; prop.length; i ) {
ret[i] = ObjectH.getEx(obj, prop[i])
}
}
return ret
},
"prop is string": function(obj, prop, returnJson) {
varkey = (prop "").split(".")
ret = obj;
for (var i = 0; i & lt;keys.length; i ) {
ret = ret[keys[i]]
}
if (returnJson) {
var json = {};
json[prop] = ret;
return json;
}
return ret; 🎜>"짜증나는" 세 번째 매개변수도 있어서 간단하게 처리했습니다. -
코드 복사
ret = {};
for (var i = 0; i & lt; prop .length ; i ) {
ret[prop[i]] = ObjectH.getEx(obj, prop[i])
}
return
},
"prop array 및 returnJson은 false입니다.": function(obj, prop, returnJson) {
ret = [];
for (var i = 0; i & lt; prop.length; i ) {
ret[ i] = ObjectH.getEx(obj, prop[i]);
}
return ret;
},
"prop는 문자열이고 returnJson은 true입니다.": function(obj, prop, returnJson ) {
var key = (prop "").split(".");
ret = obj
for (var i = 0; i & lt;keys.length; i ) {
ret = ret[keys[i]];
}
var json = {};
json[prop] = ret
return json; prop은 문자열이고 returnJson은 false입니다.": function(obj, prop, returnJson) {
varkeys = (prop "").split(".");
ret = obj;
for (var i = 0; 키.길이; i ) {
ret[keys[i]]
return
}
}; >
예를 들어 브라우저 스니핑 및 기능 감지에도 이 모드를 사용할 수 있습니다. (물론 이 형식에는 장단점이 있으므로 사용자가 직접 평가할 수 있습니다.) -
코드 복사
코드는 다음과 같습니다.
foo = FunctionH.overload(function() {