在Array原型鏈上擴展remove,contain等方法所遇到的坑

相信jser兄弟們確定會碰到這樣一個問題,數組

在作數組類的操做的時候,會要求刪除數組中的一個元素;亦或是判斷某值是否存在於這個數組;this

OK,拿刪除數組元素舉例,擴展方法爲:prototype

Array.prototype.remove = function(val){
    var index = this.indexOf(val);
    if (index > -1) {
        this.splice(index, 1);
    }
}

很簡單了擴展了一個刪除元素的方法,那麼我說的坑是什麼呢?orm

在咱們使用for··in 遍歷對象的時候是把對象的可枚舉屬性都遍歷了,!!!包括其原型鏈上的東東(坑!),下面看圖說話:對象

一張圖說明一切了對麼?你之後每次使用for···in···進行遍歷的時候都會保函在這裏所擴展的remove方法,那麼解決方案呢?原型鏈

判斷是不是它私有屬性,若是不是就說明不是本身「親生的」,直接break扔掉;rem

------------------------------------------------------------------------------------------字符串

以上狀況常常出如今字符串模板裏面,就是給String擴展一個format方法,以下原型

 

String.prototype.format = function(args) {
            var result = this;
            if (arguments.length < 1) {
                return result;
            }

            var data = arguments; // 若是模板參數是數組
            if (arguments.length == 1 && typeof (args) == "object") {
                // 若是模板參數是對象
                data = args;
            }
            for ( var key in data) {
                if(!data.hasOwnProperty(key))break;
                var value = data[key];
                if (undefined != value) {
                    result = result.replaceAll("\\{" + key + "\\}", value);
                }
            }
            return result;
        }

 

若是沒有作處理的話,偶爾碰到莫名其妙的undefined會有點摸不着頭腦~~~io

相關文章
相關標籤/搜索