摘要:最近在寫移動端的項(xiàng)目,目前還沒有引用任何庫,所以很多的方法都要自己寫。是沒有這個原生方法的,今日得閑,就自己實(shí)現(xiàn)一個吧。文檔中描述的原型是它的含義是將合并到中,并返回合并過的。
最近在寫移動端的項(xiàng)目,目前還沒有引用任何庫,所以很多的方法都要自己寫。
用慣了jQuery,當(dāng)函數(shù)參數(shù)是對象的時候,定義默認(rèn)參數(shù)的時候會寫一個defaultOptions對象,然后通過jQuery.extend將實(shí)參擴(kuò)展到defaultOptions對象上。JavaScript是沒有extend這個原生方法的,今日得閑,就自己實(shí)現(xiàn)一個吧。
先想想這個函數(shù)需要做什么。jQuery extend文檔中描述的jQuery.extend原型是
jQuery.extend( target [, object1 ] [, objectN ] )
它的含義是將object1、object2...合并到target中,并返回合并過的target。這里面有兩個點(diǎn)需要注意一下。
合并是從后到前的;
target的值是被修改了的;
是深拷貝的(若是參數(shù)對象中有屬性是對象,也是會遞歸合并的);
其實(shí)若不想原始數(shù)據(jù)被更改也很簡單,只要第一個參數(shù)傳空對象就好了。
那,直接上代嗎吧:
void function(global){ var extend, _extend, _isObject; _isObject = function(o){ return Object.prototype.toString.call(o) === "[object Object]"; } _extend = function self(destination, source){ for (var property in source) { if (source.hasOwnProperty(property)) { // 若sourc[property]是對象,則遞歸 if (_isObject(source[property])) { // 若destination沒有property,賦值空對象 if (!destination.hasOwnProperty(property)) { destination[property] = {}; }; // 對destination[property]不是對象,賦值空對象 if (!_isObject(destination[property])) { destination[property] = {}; }; // 遞歸 self(destination[property], source[property]); } else { destination[property] = source[property]; }; } } } extend = function(){ var arr = arguments, result = {}, i; if (!arr.length) return {}; for (i = 0; i < arr.length; i++) { if (_isObject(arr[i])) { _extend(result, arr[i]) }; } arr[0] = result; return result; } global.extend = extend; }(window)
這樣似乎可以了。但是貌似有一個小問題,我們這里是按照參數(shù)順序從左到右依次執(zhí)行的,但是其實(shí)若是最后一個參數(shù)有的屬性,前面的參數(shù)上的該屬性都不需要再擴(kuò)展了。其實(shí)前面的所有參數(shù)都是將自己身上有的屬性而最后一個參數(shù)沒有的屬性補(bǔ)到最后一個參數(shù)上。既如此,是不是從參數(shù)列表的右側(cè)開始擴(kuò)展更好一些。
修改以后的代碼:
void function(global){ var extend, _extend, _isObject; _isObject = function(o){ return Object.prototype.toString.call(o) === "[object Object]"; } _extend = function self(destination, source) { var property; for (property in destination) { if (destination.hasOwnProperty(property)) { // 若destination[property]和sourc[property]都是對象,則遞歸 if (_isObject(destination[property]) && _isObject(source[property])) { self(destination[property], source[property]); }; // 若sourc[property]已存在,則跳過 if (source.hasOwnProperty(property)) { continue; } else { source[property] = destination[property]; } } } } extend = function(){ var arr = arguments, result = {}, i; if (!arr.length) return {}; for (i = arr.length - 1; i >= 0; i--) { if (_isObject(arr[i])) { _extend(arr[i], result); }; } arr[0] = result; return result; } global.extend = extend; }(window)
寫代碼總是那么有意思!這里面可以看到,只要result身上有的屬性,都不需要再賦值了,嘿嘿。
當(dāng)然,目前水平有限,這段代碼肯定也還有著優(yōu)化空間,若看官有任何建議,還請不吝賜教。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/78045.html
摘要:不過的實(shí)現(xiàn)中,多了很多細(xì)節(jié)上的判斷,比如第一個參數(shù)是否是布爾值,是否是一個對象,不傳參數(shù)時的默認(rèn)值等。 JavaScritp 專題系列第七篇,講解如何從零實(shí)現(xiàn)一個 jQuery 的 extend 函數(shù) 前言 jQuery 的 extend 是 jQuery 中應(yīng)用非常多的一個函數(shù),今天我們一邊看 jQuery 的 extend 的特性,一邊實(shí)現(xiàn)一個 extend! extend 基本用...
本篇內(nèi)容主要就是元素選擇器功能用Javascript實(shí)現(xiàn)。 首先說下什么是元素選擇器? 想必大家對于jquery很了解,知道它有對元素的查找功能,解釋來說就是通過jquery的api獲取頁面元素的過程,該過程只需提供一個元素選擇的條件字符串即可獲取相應(yīng)的滿足條件的頁面元素。元素選擇器即是指通過條件字符串獲取相應(yīng)元素的一個工具函數(shù)?! ≡剡x擇器分為id選擇器、class選擇器、標(biāo)簽選擇器以...
摘要:任何函數(shù)都可以用做構(gòu)造函數(shù),構(gòu)造函數(shù)必須使用運(yùn)算符作為前綴來創(chuàng)建新的實(shí)例。當(dāng)使用關(guān)鍵字來調(diào)用構(gòu)造函數(shù)時,執(zhí)行上下文從全局對象變成一個空的上下文,這個上下文代表了新生成的實(shí)例。默認(rèn)情況下,如果構(gòu)造函數(shù)中沒有返回任何內(nèi)容,就會返回當(dāng)前的上下文。 公開記錄學(xué)習(xí)JS MVC,不知道能堅(jiān)持多久= =。以《基于MVC的JavaScript web富應(yīng)用開發(fā)》為主要學(xué)習(xí)資料。 JavaScr...
摘要:我們已經(jīng)回答了的構(gòu)造函數(shù)和原型都是誰的問題,現(xiàn)在牽扯出來一個,我們繼續(xù)檢查的構(gòu)造函數(shù)是全局對象上屬性叫的對象的原型是個匿名函數(shù),按照關(guān)于構(gòu)造函數(shù)的約定,它應(yīng)該是構(gòu)造函數(shù)的屬性我們給這個對象起個名字,叫。 我不確定JavaScript語言是否應(yīng)該被稱為Object-Oriented,因?yàn)镺bject Oriented是一組語言特性、編程模式、和設(shè)計與工程方法的籠統(tǒng)稱謂,沒有一個詳盡和大家...
摘要:專題系列共計篇,主要研究日常開發(fā)中一些功能點(diǎn)的實(shí)現(xiàn),比如防抖節(jié)流去重類型判斷拷貝最值扁平柯里遞歸亂序排序等,特點(diǎn)是研究專題之函數(shù)組合專題系列第十六篇,講解函數(shù)組合,并且使用柯里化和函數(shù)組合實(shí)現(xiàn)模式需求我們需要寫一個函數(shù),輸入,返回。 JavaScript 專題之從零實(shí)現(xiàn) jQuery 的 extend JavaScritp 專題系列第七篇,講解如何從零實(shí)現(xiàn)一個 jQuery 的 ext...
閱讀 2081·2023-04-26 02:23
閱讀 1821·2021-09-03 10:30
閱讀 1391·2019-08-30 15:43
閱讀 1222·2019-08-29 16:29
閱讀 573·2019-08-29 12:28
閱讀 2366·2019-08-26 12:13
閱讀 2255·2019-08-26 12:01
閱讀 2452·2019-08-26 11:56