2012-02-10 18 views
5

多くの配列操作(ソート、フィルタリングなど)を行うJavaScriptアプリケーションを作成しました。独自の配列オブジェクトをJavaScriptで作成できますか?

現在、私の機能は、このようなものです:

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

myarrayのは、私が働いている配列、およびARG1、ARG2であり、...配列を変更するための関数が使用する引数です。

私はそれをオブジェクトと(ア・ラ・jQueryの)引数の間に明確な分離を持ってすっきりだろうと思っています:

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

私は私が私の機能を追加するためにArray.prototypeをを使用することができることを知っていますすべての配列ですが、これは私が追加する関数が実際に私の場合に固有であり、一般的な配列に意味をなさないので重すぎます。私はオブジェクトを作成できることも知っていますが、JavaScript(indexOf、filterなど)で使用可能な配列メソッドのメリットはありません。

独自の配列オブジェクトを作成する方法はありますか?それはデフォルトの配列メソッドを継承し、自分で追加することができますか?

+3

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

今、あなたは、新しい拡張された配列を作成し、これを書くことができますoop内のすべてを必要としない – dynamic

+0

右ですが、私はそれがいかにクリーンであるか、例えばチェーン化やデフォルトのオプション/引数の定義などが好きです。説明のために – Christophe

答えて

8

次の2つのオプションが持っている:

オプション1つは、新しいメソッドを追加することによってArrayオブジェクトを拡張することです:

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

利点は、すべてのjavascript配列にこの特別なメソッドが追加されることです。複数の(外部の)javascriptライブラリが同じメソッドを追加しようとすると、これは不利になることもあります。さらに、この新しいメソッドは、問題の可能性があるfor(var item in myArray)構造に現れます。

オプション2は、あなたの拡張アレイの「ファクトリメソッド」を作成することです:、関数を使ってあなたを保つ

var arr = MyExtendedArray(); 
+0

私はファクトリメソッドが私の特定のアプリケーションに必要なものだと思います。それはとても明白です...私はそれを見ません:-)ありがとう! – Christophe

4

No. Arrayはサブクラス化できず、配列のように動作します。特に、lengthプロパティは、配列に追加または削除された要素を反映するために変更されません。 []ようnew Arrayまたは糖衣構文を介して作成されたオブジェクトのみが長さの周りに特別な処理を持っているので、これが起こる

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

理由があります。

new MyArrayは、上記そのプロトタイプArrayで通常のオブジェクトを作成しますが、オブジェクトのプロトタイプがArrayであるかどうかをチェックし、特別length取り扱いを設定newオペレータについては何もありません。

+0

+1 thx。 – Christophe

+0

奇妙なことに、配列にデータを格納するために.push()メソッドを使用すると、長さが正しく更新されます。 –

+1

@ZlatinZlatev最近のEcmaScriptの候補者は、Array、RegExp、Dateなどのサブクラス化を可能にするという目標を持っています。おそらく、配列のサブクラス化をサポートしている最近のJavaScriptエンジンの動作を見ているかもしれません。 –

0

はい、ちょうどあなたは、単に自分のオブジェクトにではなく、プロトタイプに直接機能を追加することができますjQuery.extend

4

Array prototype拡張:

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

+1 thx。私はそれをより一般的にするElianの答えを選んだ。 – Christophe

関連する問題