成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript 實(shí)現(xiàn) extend

Nekron / 1688人閱讀

摘要:最近在寫移動端的項(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

相關(guān)文章

  • JavaScript專題之從零實(shí)現(xiàn)jQuery的extend

    摘要:不過的實(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 基本用...

    wangtdgoodluck 評論0 收藏0
  • 元素選擇器功能用實(shí)現(xiàn)Javascript

      本篇內(nèi)容主要就是元素選擇器功能用Javascript實(shí)現(xiàn)。  首先說下什么是元素選擇器?  想必大家對于jquery很了解,知道它有對元素的查找功能,解釋來說就是通過jquery的api獲取頁面元素的過程,該過程只需提供一個元素選擇的條件字符串即可獲取相應(yīng)的滿足條件的頁面元素。元素選擇器即是指通過條件字符串獲取相應(yīng)元素的一個工具函數(shù)?! ≡剡x擇器分為id選擇器、class選擇器、標(biāo)簽選擇器以...

    3403771864 評論0 收藏0
  • JavaScript MVC 學(xué)習(xí)筆記(二)類的使用(上)

    摘要:任何函數(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...

    caozhijian 評論0 收藏0
  • 和少婦白潔一起學(xué)JavaScript

    摘要:我們已經(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)稱謂,沒有一個詳盡和大家...

    DevTTL 評論0 收藏0
  • JavaScript專題系列文章

    摘要:專題系列共計篇,主要研究日常開發(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...

    Maxiye 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<