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