[转帖]Mootools源码分析-02 -- Utils
生活随笔
收集整理的這篇文章主要介紹了
[转帖]Mootools源码分析-02 -- Utils
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原帖地址:http://space.flash8.net/space/?uid-18713-action-viewspace-itemid-400118
原作者:我佛山人
?
?
//檢查對象是否已經定義或者已經賦值function?$chk(obj)????{
????return?!!(obj?||?ōbj?===?0);
};
//通用清除計時器的方法,即能清setTimeout,又能清setInterval,即使計時器不存在也不會報錯
function?$clear(timer)????{
????clearTimeout(timer);
????clearInterval(timer);
????return?null;
};
/*
檢查對象屬性是否已初始化/定義,注意只能檢查對象的屬性,不能直接檢查變量
因為未定義變量在調用本方法前便會拋出錯誤,切記
*/
function?$defined(obj)????{
????return?(obj?!=?undefined);
};
//一個空的函數,主要用于事件的初始化
function?$empty()????{};
//閉包應用,延后取指定的參數值
function?$arguments(i)????{
????return?function()????{
????????return?arguments[i];
????};
};
//lambda(匿名)函數,將指定變量函數化,保證返回一個function對象,類似$splat,將變量數組化
function?$lambda(value)????{
????return?(typeof?value?==?'function')???value?:?function()????{
????????return?value;
????};
};
//淺拷貝擴展,不考慮object型屬性的,只是簡單的覆蓋
function?$extend(original,?extended)????{
????for?(var?key?in?(extended?||?{}))????original[key]?=?extended[key];
????return?original;
};
//解鏈對象,主要是解決object類型的變量賦值時會影響原值的問題,所以修改其實我覺得叫clone的話更明了
function?$unlink(object)????{
????var?unlinked?=?null;
????switch?($type(object))????{
????case?'object':
????????unlinked?=?{};
????????//深拷貝
????????for?(var?p?in?object)????unlinked[p]?=?$unlink(object[p]);
????????break;
????case?'hash':
????????//深拷貝
????????unlinked?=?$unlink(object.getClean());
????????break;
????case?'array':
????????unlinked?=?[];
????????//深拷貝
????????for?(var?i?=?0,?l?=?object.length;?i?<?l;?i++)????unlinked[i]?=?$unlink(object[i]);
????????break;
????default:
????????return?object;
????}
????return?unlinked;
};
//合并所有對象,參數位置越后優先級越高,就是說后面的參數對象屬性會覆蓋前面的,注意用到了$unlink
function?$merge()????{
????var?mix?=?{};
????for?(var?i?=?0,?l?=?arguments.length;?i?<?l;?i++)????{
????????var?ōbject?=?arguments[i];
????????if?($type(object)?!=?'object')?continue;
????????for?(var?key?in?object)????{
????????????var?ōp?=?object[key],?mp?=?mix[key];
????????????mix[key]?=?(mp?&&?$type(op)?==?'object'?&&?$type(mp)?==?'object')???$merge(mp,?op)?:?$unlink(op);
????????}
????}
????return?mix;
};
//返回參數列表中從左到右第一個已定義的表達式的值
function?$pick()????{
????for?(var?i?=?0,?l?=?arguments.length;?i?<?l;?i++)????{
????????if?($defined(arguments[i]))????return?arguments[i];
????}
????return?null;
};
//在min到max之間取一個隨機數
function?$random(min,?max)????{
????return?Math.floor(Math.random()?*?(max?-?min?+?1)?+?min);
};
//變量數組化,通常用于保證之后的代碼能執行數組的each方法
function?$splat(obj)????{
????var?type?=?$type(obj);
????return?(type)???((type?!=?'array'?&&?type?!=?'arguments')???[obj]?:?obj)?:?[];
};
//當前的時間截,Fx中的時間周期判斷使用較多
var?$time?=?Date.now?||?function()????{
????return?new?Date().getTime();
};
//依次嘗試執行參數列表中的函數,與Prototype的Try.these異工同曲之妙,只是更簡練
function?$try()????{
????for?(var?i?=?0,?l?=?arguments.length;?i?<?l;?i++)????{
????????try?{
????????????return?arguments[i]();
????????}?catch(e)????{}
????}
????return?null;
};
//判斷對象類型,JS中很多類型typeof都是object,無法精確判斷,但是因為有Native的實現,使精確判斷類型成為了可能
function?$type(obj)????{
????if?(obj?==?undefined)????return?false;
????//此行代碼的實現有賴于Native的創意
????if?(obj.$family)
????????return?(obj.$family.name?==?'number'?&&?!isFinite(obj))???false?:?obj.$family.name;
????if?(obj.nodeName)????{
????????switch?(obj.nodeType)????{
????????case?1:?return?'element';
????????case?3:?return?(/\S/).test(obj.nodeValue)???'textnode'?:?'whitespace';
????????}
????}?else?if?(typeof?obj.length?==?'number')????{
????????if?(obj.callee)?return?'arguments';
????????else?if?(obj.item)?return?'collection';
????}
????return?typeof?obj;
};
?
轉載于:https://www.cnblogs.com/maapaa/articles/mootools-s-2.html
總結
以上是生活随笔為你收集整理的[转帖]Mootools源码分析-02 -- Utils的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机网络第七版课后答案(谢希仁版)
- 下一篇: 九型人格测试