7

各オブジェクトがアクセスできるオブジェクトの配列に関数を追加しようとしていますが、各オブジェクトに個別に追加する必要はありません。

簡単な例を挙げましょう。

同様のオブジェクトを含む配列があり、それぞれがプロパティ x とプロパティ y を持っているとします。

var objects = [{x:1, y:2},
               {x:0, y:5},
               {x:3, y:14}
              ];

xオブジェクトの合計との合計を計算したいと思いyます。

最初のアプローチ:

特定のオブジェクトの合計を計算するには、このオブジェクトを定義済みの関数に次のように渡すことができます。

function xySum1(o) {return o.x + o.y;}

objects[0].x       //--> returns 1
objects[0].y       //--> returns 2
xySum1(objects[0]) //--> returns 3

xおよびyプロパティへのアクセスが異なる方法で行われるため、これは非常に見苦しく、満足のいくものではありません。また、私のコードは別の場所にあり、関数xySum1が配列内のオブジェクトに作用するように作成されていることを簡単に認識できません。

2 番目のアプローチ:

配列をループして、関数をプロパティとして各オブジェクトに追加できます。

for (var i=0; i < objects.length; i++) {
    objects[i].xySum2 = function() {return this.x + this.y;};
}

さて、合計は次のように得られます

objects[0].x        //--> returns 1
objects[0].y        //--> returns 2
objects[0].xySum2() //--> returns 3

これははるかに優れています。

問題

ただし、このアプローチには問題があります。まず、配列に新しい要素を追加するとき

objects.push({x:5,y:21});

関数がオブジェクトに追加される前に合計を計算することはできません

objects[3].xySum2() //-->TypeError

もう 1 つの問題は、多くのオブジェクトと、それらに追加する多くの関数があることです。各関数を各オブジェクトに個別に追加するのは、メモリ スペースの無駄遣いのようです。

これをより効率的に行う方法はありますか?

4

1 に答える 1