javascript匿名函数作为对象方法

时间:2018-09-11 02:26:41

标签: javascript arrays object anonymous-function

我有一个创建对象并计算一些属性的小功能

function MyArrayObj(array) {
    this.array  = array;
    this.sorted = (function (arr) { return arr.sort(function(a, b) { return a - b }) })([...this.array]);
    this.max    = this.sorted.slice(-1).pop();
    this.min    = this.sorted[0];
    this.sum    = this.sorted.reduce(function(a, b) { return a + b; }, 0);
    this.unique = [...new Set(this.sorted)];
}

之所以这样做,是因为我希望在创建对象后就准备好一切。

但是我对this.sorted有一个疑问:每次调用它的值都会被计算吗?创建对象时还是只有一次?

PS:我应该这样做吗?还是等到我真正需要maxmin等,然后才获取值才更好?

1 个答案:

答案 0 :(得分:1)

sorted不是函数,而是调用值为function (arr) { return arr.sort(function(a, b) { return a - b }) }的匿名函数[...this.array]的结果。因此,它本身并不是要再次调用的函数。

  

PS:我应该这样做吗?还是等到我真正需要maxmin等,然后才获取值才更好?

这当然取决于您的应用程序。如果您可能不再需要它们,那么等待是有道理的。但是,如果您可能会需要它们中的任何一个,特别是如果您打算不止一次使用它们,那么,由于其中唯一昂贵的操作是sorted(无论如何也要在其他一些中使用),您可能会好在前面做。这种方式的代码更加简洁。

但是说到干净的代码...如果您不需要此对象的原型(即,您没有向此类型添加方法),那么使用工厂函数创建它可能会更干净(因此跳过new运算符。)这是一个版本:

const myArrayObj = (array, sorted = [... array].sort()) => ({
  array,
  sorted,
  max: sorted[sorted.length - 1],
  min: sorted[0],
  sum: array.reduce((a, b) => a + b, 0),
  unique: [... new Set(sorted)]
})

如果您不希望以这种方式定义sorted,则可以这样做

const myArrayObj = (array) => { 
  const sorted = [... array].sort())
  return {
    array,
    // ...
  }
}

另外一点。如果您本身需要sorted,就可以了。但是,如果您只想让sorted得到maxmin,那么执行O(n * log(n))操作来获取可以在{{1 }} 那些。根据您的数据,这可能永远不会成为问题,但是值得考虑。