寄生建構函式 擴充套件原生陣列

2021-06-18 09:26:24 字數 1514 閱讀 5275

最近在產品研發過程中,發現需要對原生陣列進行一些擴充套件,我們深知修改原生物件的弊端,尤其在產品化的程式中修改原生物件的原型。如果因某個實現中缺少某個方法,就在原生物件的原型中新增這個方法,那麼當在另乙個支援該方法的實現中執行**時,就可能會導致命名衝突。而且,這樣做也可能會意外地重寫原生方法,大名鼎鼎的prototype框架敗因也在於此,改寫了大量原生物件,當ecmascript公升級時,面臨著許多改寫方法與原生方法重名的問題,因此要不斷地更改這些原有的擴充套件名稱,導致一系列附帶問題的出現。

工作中對於這樣的問題我採用了「寄生建構函式模式」對原生陣列進行了擴充套件,雖然這種方法大家都不怎麼使用,但是處理這種型別的問題,只有這種方式才最有效。如果採用傳統的組合建構函式和原型模式,無形中也就犯了在原生物件上進行擴充套件的毛病,修改了原生陣列。

寄生建構函式模式到底是一種什麼樣子的呢?

var myarray = function () 

}return -1;

};//檢查某值是否在陣列中

arr.hasitem = function (item) ;

//不允許插入陣列中已有的值,這裡也可以傳入乙個陣列

function _push(aitem) else

}if (aext.length > 0)

};if ($.isarray(aitem)) else

return arr;

};//移除某值,或某個陣列

arr.remove = function (aitem) }};

if ($.isarray(aitem)) else

return arr;

};//清空陣列

arr.clearall = function () ;

//在某個索引處插入某值

arr.insert = function (target, indexpos) else

} else

return arr;

};//去除重複項

arr.removerepeat = function () , res = , l = arr.length;

if (l > 0) }}

return res;

};//返回新物件,這個新物件重寫呼叫建構函式時返回的值this

return arr;

};

在這個例子中,myarray函式建立了乙個新物件,並以相應的屬性和方法初始化該物件,然後又返回了這個物件。除了使用new操作符並把使用的包裝函式叫做建構函式之外,這個模式跟工廠模式其實是一模一樣的。建構函式在不返回值的情況下,預設返回新物件例項。而通過在建構函式的末尾新增乙個return語句,可以重寫呼叫建構函式時返回的值this。

關於寄生建構函式模式,有一點需要說明:首先,返回的物件與建構函式或者與建構函式的原型屬性之間沒有關係;也就是說,建構函式返回的物件與在建構函式外部建立的物件沒有什麼不同。為此,不能依賴instanceof操作符來確定物件型別。由於存在上述問題,所以通過這種模式建立的物件例項型別只能是object。

正則的擴充套件 RegExp建構函式

1.regexp建構函式 在es5中,regexp建構函式的引數有兩種情況。第一種情況是,引數是字串,這時第二個引數表示正規表示式的修飾符 flag var regex new regexp xyz i 等價於 var regex xyz i 第二種情況是,引數是乙個正規表示式,這時會返回乙個原有正...

C 建構函式和陣列

建構函式和陣列 include using namespace std 是乙個語句 class ctest 建構函式 1 ctest int n,int m 建構函式 2 ctest 建構函式 3 intmain 三個元素分別用建構函式 1 2 3 初始化 cout array1 3 ended e...

取代PHP原生函式的一些擴充套件包

雖然程式設計師無時無刻都在造輪子,但造輪子也有效率之分,用好輪子才能造出好 composer require guzzlehttp guzzle你可以用guzzlehttp完全取代curl,file get content,fopen等函式。這個擴充套件包使用起來極為順手。我們在 量上看下對比。初始...