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

一种方法是使用包装对象,如 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 回答