2012-02-10 111 views
5

我創建了一個有很多數組操作(排序,過濾等)的JavaScript應用程序。我可以在JavaScript中創建自己的數組對象嗎?

目前我的職務是這樣的:

function (myArray, arg1, arg2,...) 

其中myarray的是數組我的工作,和ARG1,ARG2,...是使用的函數修改數組的參數。

我想,這將是整潔有對象和論據之間的明確分離(一拉的jQuery):

myArray.function(arg1, arg2,...) 

我知道,我可以用Array.prototype我的功能添加到所有的數組,但這似乎太重,因爲我添加的函數真的是特定於我的情況,並且對數組通常沒有意義。我也知道我可以創建一個對象,但是我不會從JavaScript中提供的數組方法(indexOf,filter等)中受益。

有沒有一種方法可以創建我自己的數組對象,它會繼承默認的數組方法並允許我添加自己的數組對象?

+3

守,你不需要一切在OOP – dynamic 2012-02-10 19:27:00

+0

正確,但我喜歡它是多麼乾淨,例如鏈接或定義默認選項/參數。 – Christophe 2012-02-10 19:31:40

回答

8

你有兩個選擇:

選項一是通過添加新方法來擴展Array對象:

Array.prototype.myMethod = function(arg1, arg2) 
{ 
    // Use 'this' to access the array. 
} 

好處是每個javascript數組現在都有這個額外的方法。當多個(外部)JavaScript庫試圖添加相同的方法時,這也可能是一個缺點。此外,這種新方法將出現在for(var item in myArray)構造中,這可能是有問題的。

方案二爲您的擴展陣列創建一個「工廠法」:

function MyExtendedArray = function() 
{ 
    var array = []; 
    array.myMethod = function(arg1, arg2) { 
     // Use 'this' or 'array' to access the array. 
    }; 

    return array; 
}; 

現在你可以這樣寫,以創建一個新的擴展陣列:使用功能

var arr = MyExtendedArray(); 
+0

我認爲工廠方法正是我需要的特定應用程序。這是顯而易見的...不是我看到它:-)謝謝! – Christophe 2012-02-10 20:00:59

4

No. Array不能被子類化,仍然表現得像一個數組。具體而言,length屬性不會更改以反映從陣列添加或刪除的元素。

function MyArray() {} 
MyArray.prototype = []; 
MyArray.prototype.constructor = MyArray; 
var instance = new MyArray; 
instance[0] = 0; 
alert(instance.length); // alerts 0 

出現這種情況的原因是因爲只有通過new Array或語法糖產生像[]物體周圍有長度的特殊處理。

new MyArray上面創建常規的對象,它的原型是一個Array,但並沒有什麼關於new操作員檢查對象的原型是一個Array,並設置了專門的length處理。

+0

+1 thx的解釋。 – Christophe 2012-02-10 20:04:04

+0

奇怪的是,如果您使用.push()方法將數據存儲到數組,則length會正確更新。 – 2015-08-31 11:36:29

+1

@ZlatinZlatev,最近的EcmaScript候選人有一個允許子類化Array,RegExp和Date等目標的目標,因此這個答案可能不再正確。也許你正在看到最近的JavaScript引擎中的行爲正在實現對數組的子類化的一些支持。 – 2015-08-31 12:48:04

4

您可以只是簡單地直接添加的功能,你的對象,而不是原型:

var myArray = new Array(); 
myArray.myFunc = function(){ /* do stuff! */ }; 
myArray.myFunc(); 
+0

+1 thx。我選擇了埃利安的答案,使其更通用。 – Christophe 2012-02-10 20:02:18

相關問題