3

追加のメソッドを含む配列を返したい。私は通常、次のようなことをします:

MyConstructor = function(a, b, c){
    var result = [a, b, c];
    result.method1 = function(){
        return a + b + c ;
    }
    return result ;
}

var obj = MyConstructor(2, 4, 6); // removed `new`

しかし、メソッドと使用の数が増えるにつれて、これらの新しい (同一の) 匿名関数を毎回定義する代わりに、プロトタイプを使用する方が保守が容易になる (そしてより効率的になる) と思いますが、これを行う方法が見つかりません。これらのメソッドがArray.prototype.

これは可能ですか?

4

2 に答える 2

2

プロトタイプチェーンで使用できるように例を変更すると、次のようになります。

// this could still be    var MyConstructor = function...
// but I prefer this form for Classes
function MyConstructor(a, b, c){
    this.result = [a, b, c];
}

MyConstructor.prototype.method1 = function(){
    // Array.reduce can be used for summation, or you could hardcode something like:
    // return this.result[0] + this.result[1] + this.result[2]
    // or do a summation through a for-loop, etc 
    return this.result.reduce(function(a,b){return a+b});
}

var obj = new MyConstructor(2, 4, 6);
console.log(obj.result, obj.method1()); // [2, 4, 6]  12
于 2013-02-13T18:26:11.003 に答える
2

1 つのアプローチは、Shmiddty による回答のように、ラッパー オブジェクトを使用することです。

または、ラッパーを使用したくないが、配列を直接変更したい場合は、単に拡張することができます:

// Define some special methods for use
var specialMethods = {
  sum: function() {
    var i = 0, len = this.length, result = 0;
    for (i; i < len; i++) result += this[i];
    return result;
  },
  average: function() {
    return this.sum() / this.length;
  }
};

function specialize(array) {
  var key;
  for (key in specialMethods) {
    if (specialMethods.hasOwnProperty(key)) {
      array[key] = specialMethods[key];
    }
  }
  return array;
}

var arr = specialize([1, 2, 3, 4, 5]);
console.log(arr.sum()); // 15
console.log(arr.average()); // 3

この方法では、触れずArray.prototypeに、メソッドを何度も再定義することなく配列に追加できます。ただし、それらは各配列にコピーされるため、メモリのオーバーヘッドが発生することに注意してください。これは、プロトタイプのルックアップを行っているわけではありません。

また、配列を操作する関数をいつでも定義できることに注意してください。

function sum(array) {
  var i = 0, len = array.length, result = 0;
  for (i; i < len; i++) result += array[i];
  return result;
}

の構文シュガーは得られませんsomearray.sum()が、sum関数は一度しか定義されていません。

それはすべて、必要なもの/欲しいものに依存します。

于 2013-02-13T18:35:53.343 に答える