たまたま、infinte の学生が「よりエレガントな互換性」を提案しましたが、これは実際にこの問題に関連しています (後で説明します)
youa のスクリプト ライブラリの Function の Helper に Supports を追加しますオーバーロードされたパターンマッチング
/**
* 関数パラメーターのオーバーロード メソッドのオーバーロード。関数パラメーターのパターン マッチングを実行します。デフォルトのディスパッチャは * と... および ? をサポートします。「*」は任意の型のパラメータを表し、「...」は任意の型の複数のパラメータを表します。「?」は通常、「,?...」で使用されます。または任意の数のパラメータ
* @method overload
* @static
* @optional {dispatcher} はパラメータのディスパッチを担当する関数と一致するために使用されます
* @param {func_maps} は以下に基づいて呼び出しを受け入れます一致する関数リスト
* @return {function} オーバーロードされた関数
*/
オーバーロード: function(dispatcher, func_maps) {
if (! (関数のディスパッチャーインスタンス)) {
func_maps = ディスパッチャー;
ディスパッチャー = 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 には 2 つのパラメーターが含まれており、1 つは一致条件の処理を担当するディスパッチャー関数です (オプション)もう 1 つは関数マッピング テーブルのセットです。たとえば、呼び出される 3 つのパラメーターは 10、「a」、および [1,2] です。 "number"、string、array" を生成します。パターン マッチングを実装する場合、関数マッピング テーブルの各 "キー" に基づいて正規表現が生成されます。この正規表現は、ディスパッチャ関数の戻り値と一致するために使用されます。一致する場合は、対応するキーが呼び出されます。そうでない場合は、シーケンス内の次のキーと一致します。例:
getEx: function(obj, prop, returnJson) {
var ret, propType = ObjectH.getType(prop)
if (propType == '配列') {
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 = []; = 0; i & lt; prop.length; i ) {
ret[i] = ObjectH.getEx(obj, prop[i]); >//getEx(obj, prop)
var key = (prop "").split(".");
ret = obj;
for (var i = 0; i & lt; キー.length; i ) {
ret = ret[keys [i]];
if (returnJson) {
json[prop] = ret;
return json;
}
}
return ret;
},
上記の場合の「悪」の if は次のように最適化できます。 >
コードをコピー
コードは次のとおりです:
} else {
ret = []; i = 0; i & lt; prop.length; i ) {
ret[i] = ObjectH.getEx(obj, prop[i]);
}
🎜>},
"*,string,*": function( obj, prop, returnJson) {
var key = (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
}
return;
}
OK、一部の人にとっては、このフォームは元のフォームよりも優れているように見えるかもしれませんが、実際にはさらに進めることができます -
コードをコピー
コードは次のとおりです:
getEx: FunctionH.overload(function(args) {
return "prop は " ObjectH.getType(args[1]);
},{
"prop は配列": 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 は string": function(obj, prop, returnJson) {
var key = (prop "").split("."); obj;
for (var i = 0; i & lt; keys.length; i ) {
ret = ret[keys[i]]
}
if (returnJson); >var json = {};
json[prop] = ret;
return
}
}),
「迷惑な」3 番目のパラメータもあるので、これも単純に処理しました -
コードをコピー
"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
},
" 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 = {};
return json; prop は文字列で、returnJson は false": function(obj, prop, returnJson) {
var key = (prop "").split(".");
ret = obj;
for (var i = 0; i & lt; キーの長さ; i ) {
ret = ret[keys[i]]
戻り値
}); >
たとえば、ブラウザのスニッフィングや機能検出でもこのモードを使用できます (もちろん、この形式には長所と短所があり、ユーザーは自分で比較検討できます) -
コードをコピー
コードは次のとおりです:
foo = FunctionH.overload(function() {
return MSIE ? "IE": " NotIE";
},{
"IE": function() {...}
"NotIE": function() {...}
});