各オブジェクトがアクセスできるオブジェクトの配列に関数を追加しようとしていますが、各オブジェクトに個別に追加する必要はありません。配列内のすべてのオブジェクト間のjavascript関数の共有
私はあなたに簡単な例を教えてください。
は、各プロパティ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
は、配列内のオブジェクトに作用するように作成されていると容易には認識できません。
第二のアプローチ:
一可能性配列をループし、各オブジェクトにプロパティとしての機能を追加します。
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
に追加される前にまず、その合計が計算できないもう一つの問題は、私は多くのオブジェクトを持っているということで、それらに追加する多くの機能。それぞれのオブジェクトに個々のオブジェクトを個別に追加するのは、良いメモリ空間を無駄にしているようです。
これをより効率的に行う方法はありますか?
'objects.xySum(0)'についてはどうですか? – Bergi
はおそらくコンストラクタを定義すると、関数はプロトタイプに入りますか? – user2264587
また、Object.prototypeメソッドを以下のように定義することもできます: 'Object.prototype.xySum = function(){return typeof this.x!== '未定義' && this.y!== 'undefined'? this.x + this.y:undefined;} '。 – dfsq