> 웹 프론트엔드 > JS 튜토리얼 > 패턴 매칭을 통한 JavaScript 오버로딩_javascript 팁

패턴 매칭을 통한 JavaScript 오버로딩_javascript 팁

WBOY
풀어 주다: 2016-05-16 18:21:21
원래의
1015명이 탐색했습니다.

마침 인피니트 학생이 이 문제와 실제로 관련된 "더 우아한 호환성"을 제안했습니다(나중에 살펴보겠습니다)

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
},


위의 경우 "악"은 다음과 같이 최적화될 수 있습니다. >


코드 복사 코드는 다음과 같습니다. getEx: FunctionH.overload({
" *,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; 🎜>"짜증나는" 세 번째 매개변수도 있어서 간단하게 처리했습니다. -



코드 복사

코드는 다음과 같습니다. 다음: getEx: FunctionH.overload(function(args) { return "prop는 " ObjectH.getType(args[1]) "이고 returnJson은 " args[2]입니다. },{ "prop은 배열이고 returnJson은 true입니다.": function(obj, prop, returnJson) {
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() {
관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿