extend
第 一个参数可以对象 也可以是布尔 (如果是布尔值表示是否深度便利)
如果是一个对象则 扩展到原来的对象上去
如果是多个对象 则每个对象都扩展到原来的对象上去
var wt = function(){
};
wt.extend = function() {
var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;
//根据第一个参数来判断是否深度遍历
if ( typeof target === "boolean" ) {
deep = target;
target = arguments[1] || {};
i = 2;
}
if ( typeof target !== "object" )
target = {};
//如果只有一个遍历对象 (在有判断深度遍历的时候 i=2了 这时是2个以上参数 遍历对象从地2个开始)
// 用 target引用wt
if ( length == i ) {
target = this;
--i;
}
for ( ; i < length; i++ )
if ( (options = arguments[ i ]) != null )
for ( var name in options ) {
var src = target[ name ], copy = options[ name ];
if ( target === copy )
continue;
//如果他们引用的同一个对象 跳出循环 避免重复遍历
if ( deep && copy && typeof copy === "object" && !copy.nodeType )
target[ name ] = wt.extend( deep,
src || ( copy.length != null ? [ ] : { } )
, copy );
//进行深度遍历
else if ( copy !== undefined )
target[ name ] = copy;
}
return target;
};
each
有3个参数 第一个是集合 可以是数组,对象,元素集合(如document.body.getElementsByTagName('div'))
第2个参数是函数 就是每次便利的时候需要执行的函数
如果不带第3个参数arg
且如果第一个参数是obj callbacl的第一个参数是 属性名 第二个是属性直
如果第一个参数是 数组or元素集合 则第一个参数某项的索引 第2个参数是直
第3个参数 是指callback的所需要的参数 可以为空 且必须为数组
- function each( object, callback, args ) {
- var name, i = 0, length = object.length;
- //
- if ( args ) {
- //如果有参数 且object是对象 便利对象 并且用object所对应的属性值来调用callback
- if ( length === undefined ) {
- for ( name in object )
- if ( callback.apply( object[ name ], args ) === false ) //提供一个可以调处循环的机制 如果执行完callback返回的是false 则跳出循环
- break;
- } else
- //如果有参数 且object是数组or元素集合 则....
- for ( ; i < length; )
- if ( callback.apply( object[ i++ ], args ) === false )
- break;
- } else {
- //如果没有参数且object是对象 则执行下面的
- if ( length === undefined ) {
- for ( name in object )
- if ( callback.call( object[ name ], name, object[ name ] ) === false )
- break;
- } else
- for ( var value = object[0];
- i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}
- }
- return object;
- }
- //对象的用法 且没有第3个参数
- each({a:'aa',b:'bb'},function(key,value){
- alert(key+'---------'+value); //可以看到第一个参数是对象的属性 第2个参数是该属性对应的值
- });
- each({a:'aa'},function(){
- for(var i=0,l=arguments.length;i<l;i++){
- alert(arguments[i]) //可以看出打印出来的是1 2 3 4 5
- }
- },[1,2,3,4,5]);
- //如果是数组
- each(['a','s','d','f'],function(i,value){
- alert(value+'---------'+i); //可以看到第2个参数是数组里面的某项 第1个参数i是该项的索引
- });
- //元素集合的暂时忽略
browser
判断浏览器的类型 根据window.navigator.userAgent字符串来判断浏览器的类型
- +function(userAgent){
- window.browser = {
- version: (userAgent.match( /.+(?:rv|it|ra|ie)[//: ]([/d.]+)/ ) || [0,'0'])[1],
- safari: /webkit/.test( userAgent ),
- opera: /opera/.test( userAgent ),
- msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
- mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
- };
- }(navigator.userAgent.toLowerCase());
- browser.msie&&(alert('IE'+browser.version));
- browser.mozilla&&(alert('火狐'+browser.version));