摘要:實(shí)現(xiàn)所需要的功能性函數(shù)判斷是不是函數(shù)在有些瀏覽器會(huì)返回所以判斷是不是節(jié)點(diǎn)創(chuàng)建一個(gè)計(jì)劃對(duì)象代理訪問的時(shí)候可以節(jié)省代碼方法注意是函數(shù)的方法,而不是方法函數(shù)轉(zhuǎn)成字符串代理拷貝計(jì)劃對(duì)象方法判斷是否為計(jì)劃對(duì)象在當(dāng)前頁面內(nèi)追加換行標(biāo)簽和指定的內(nèi)容在中返
jquery extend
實(shí)現(xiàn)extend 所需要的功能性函數(shù)
// 判斷是不是函數(shù) function isFunction(obj) { // Support: Chrome <=57, Firefox <=52 /* 在有些瀏覽器 typeof document.createElement( "object" ) 會(huì)返回function 所以判斷是不是dom 節(jié)點(diǎn) */ return typeof obj === "function" && typeof obj.nodeType !== "number"; }; // 創(chuàng)建一個(gè)計(jì)劃對(duì)象 let class2type = {}; // 代理 hasOwnProperty 訪問Object.hasOwnProperty的時(shí)候可以節(jié)省代碼 let hasOwn = class2type.hasOwnProperty; // hasOwn toString方法 注意是函數(shù)的toString方法,而不是{}toString 方法 let fnToString = hasOwn.toString; // Object() 函數(shù)轉(zhuǎn)成字符串 "function Object() { [native code] }" let ObjectFunctionString = fnToString.call(Object); // 代理 let getProto = Object.getPrototypeOf; // 拷貝計(jì)劃對(duì)象方法 toString = class2type.toString; // 判斷是否為計(jì)劃對(duì)象 /* //在當(dāng)前頁面內(nèi)追加換行標(biāo)簽和指定的HTML內(nèi)容 function w( html ){ document.body.innerHTML += "
" + html; } w( $.isPlainObject( { } ) ); // true w( $.isPlainObject( new Object() ) ); // true w( $.isPlainObject( { name: "CodePlayer"} ) ); // true w( $.isPlainObject( { sayHi: function(){} } ) ); // true w( $.isPlainObject( "CodePlayer" ) ); // false w( $.isPlainObject( true ) ); // false w( $.isPlainObject( 12 ) ); // false w( $.isPlainObject( [ ] ) ); // false w( $.isPlainObject( function(){ } ) ); // false w( $.isPlainObject( document.location ) ); // false(在IE中返回true) function Person(){ this.name = "張三"; } w( $.isPlainObject( new Person() ) ); // false window false new Date false */ function isPlainObject(obj) { var proto, Ctor; // obj false,或者obj不是對(duì)象,排除null和undefined 否則getProto(obj) 報(bào)錯(cuò) if (!obj || toString.call(obj) !== "[object Object]") { return false; } proto = getProto(obj); // 如果是對(duì)象但是沒有原型則是由 Object.create( null ) 創(chuàng)建 if (!proto) { return true; } // 原型的構(gòu)造函數(shù)是 Object(),則為計(jì)劃對(duì)象 Ctor = hasOwn.call(proto, "constructor") && proto.constructor; return typeof Ctor === "function" && fnToString.call(Ctor) === ObjectFunctionString; }
extend 代碼分析
// extend 代碼分析 var jQuery = {}; /* jQuery.extend()函數(shù)用于將一個(gè)或多個(gè)對(duì)象的內(nèi)容合并到目標(biāo)對(duì)象。 jQuery.extend( [ deep ], target , object1 [, objectN... ] ) */ jQuery.extend = jQuery.prototype.extend = function () { // 定義后邊用到的變量 var options, name, src, copy, copyIsArray, clone, // 第一個(gè)參數(shù)為目標(biāo)對(duì)象 target = arguments[0] || {}, i = 1, length = arguments.length, // 是否為深拷貝 deep = false; // 深度拷貝 /* 如果第一個(gè)參數(shù)為布爾值則代表深拷貝 */ if (typeof target === "boolean") { deep = target; // Skip the boolean and the target 將第二個(gè)參數(shù)設(shè)置為目標(biāo)對(duì)象 target = arguments[i] || {}; i++; } // 參數(shù)不是對(duì)象的情況 if (typeof target !== "object" && !isFunction(target)) { target = {}; } // 如果只有一個(gè)參數(shù)或者兩個(gè)參數(shù)且第一個(gè)參數(shù)為 deep 擴(kuò)展自身 if (i === length) { target = this; i--; } for (; i < length; i++) { // 參數(shù)不是null 或者undefined /* null == undefined // true null == null // true */ if ((options = arguments[i]) != null) { // 擴(kuò)展對(duì)象 for (name in options) { src = target[name]; copy = options[name]; /* target = {a:1,b:2} options = { test: target } target.test = target; //會(huì)出現(xiàn)無法遍歷 */ if (target === copy) { continue; } // 判斷是深拷貝,且copy為數(shù)組或者計(jì)劃對(duì)象 /* 計(jì)劃對(duì)象 { } new Object() */ if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = Array.isArray(copy)))) { // 數(shù)組 if (copyIsArray) { copyIsArray = false; clone = src && Array.isArray(src) ? src : []; } else { // 對(duì)象 clone = src && jQuery.isPlainObject(src) ? src : {}; } // Never move original objects, clone them target[name] = jQuery.extend(deep, clone, copy); // Don"t bring in undefined values // 如果拷貝值為null/undefined 則不拷貝 } else if (copy !== undefined) { target[name] = copy; } } } } return target; };
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/99774.html
摘要:在中并沒有類的概念,不過為了好解釋或者是思想上的統(tǒng)一。這樣的話,不論是男人,女人,人等能繼承這個(gè)技能方法了。這樣就可以將進(jìn)行合并,然后將合并結(jié)果返回給了。 最近在看一些jQuery的插件源碼,發(fā)現(xiàn)了jQuery.extend()和jQuery.fn.extend()兩個(gè)方法在插件中用到的頻率非常高,在網(wǎng)上查詢了下,說的要么是不清楚,要么就是不好理解?;诖?,我寫下自己的一些看些,希望大...
摘要:的指向的是對(duì)象,所以此時(shí)擴(kuò)展的是對(duì)象,可以直接通過的方式調(diào)用。 寫過jquery插件的人都知道可以通過jquery提供的extend可以對(duì)jquery對(duì)象進(jìn)行擴(kuò)展,而且該方法不僅可以對(duì)jquery對(duì)象擴(kuò)展,還能給一個(gè)對(duì)象添加新的屬性和方法,這個(gè)在后面會(huì)介紹。 通過不同的方式調(diào)用extend擴(kuò)展的方法也不同: 通過 $.extend() 擴(kuò)展的是靜態(tài)方法; 而通過 $.fn.exten...
摘要:文檔上的解釋將一個(gè)或者多個(gè)對(duì)象擴(kuò)展一個(gè)新對(duì)象,返回一個(gè)新的對(duì)象是否深度克隆對(duì)象,將要擴(kuò)展到的新對(duì)象,待合并到新對(duì)象的第一個(gè)對(duì)象,待合并到新對(duì)象的第個(gè)對(duì)象例將合并到作為一個(gè)新對(duì)象,此時(shí)輸出的所輸出內(nèi)容將是兩個(gè)對(duì)象屬性集合,我們之所以這么做,可 Jquery extend() API文檔上的解釋:將一個(gè)或者多個(gè)對(duì)象擴(kuò)展一個(gè)新對(duì)象,返回一個(gè)新的對(duì)象 $.extend([deep],targ...
摘要:文章出處拜讀一個(gè)開源框架,最想學(xué)到的就是設(shè)計(jì)的思想和實(shí)現(xiàn)的技巧。利用下的簡(jiǎn)單工廠模式,來將所有對(duì)于同一個(gè)對(duì)象的操作指定同一個(gè)實(shí)例。所以的中提供了以上中擴(kuò)展函數(shù)。 文章出處 http://www.cnblogs.com/aaronjs/p/3278578.html 拜讀一個(gè)開源框架,最想學(xué)到的就是設(shè)計(jì)的思想和實(shí)現(xiàn)的技巧。 廢話不多說,jquery這么多年了分析都寫爛了,老早以前就拜讀過,...
摘要:示例合并和,修改并返回。例如我們插件里面需要有個(gè)方法來檢測(cè)用戶調(diào)用插件時(shí)傳入的參數(shù)是否符合規(guī)范。私有方法,檢測(cè)參數(shù)是否合法調(diào)用調(diào)用調(diào)用者覆蓋插件暴露的共公方法調(diào)用自定義高亮插件 本文實(shí)例講述了jQuery插件編寫步驟。分享給大家供大家參考,具體如下: 如今做web開發(fā),jquery 幾乎是必不可少的,就連vs神器在2010版本開始將Jquery 及ui 內(nèi)置web項(xiàng)目里了。至于使用jq...
摘要:源碼學(xué)習(xí)之用于合并對(duì)象,可選擇是否深復(fù)制。盡管官方文檔明確指出第一個(gè)參數(shù)是的調(diào)用情況并不支持,但是這個(gè)版本的源碼中,判斷第一個(gè)參數(shù)的類型雖有限定是類型,但卻未對(duì)其值真假加以限定。調(diào)用方式源碼和指向同一個(gè)函數(shù),在函數(shù)內(nèi)部,對(duì)調(diào)用情況進(jìn)行區(qū)分。 jQuery源碼學(xué)習(xí)之extend $.extend用于合并對(duì)象,可選擇是否深復(fù)制。使用時(shí),第一個(gè)參數(shù)為合并后的對(duì)象。如果要進(jìn)行深拷貝,則參數(shù)1為...
閱讀 3688·2021-09-22 15:34
閱讀 1200·2019-08-29 17:25
閱讀 3410·2019-08-29 11:18
閱讀 1384·2019-08-26 17:15
閱讀 1755·2019-08-23 17:19
閱讀 1241·2019-08-23 16:15
閱讀 729·2019-08-23 16:02
閱讀 1348·2019-08-23 15:19