javascript 匿名函数作为对象方法

javascript anonymous function as object method

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

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 等时才获取值会更好?

这里的

sorted不是函数,而是调用匿名函数function (arr) { return arr.sort(function(a, b) { return a - b }) }的结果,值为[...this.array]。所以它本身不是一个会被再次调用的函数

PS: should i be doing this? or would it be better to wait until i actually need max, min, etc. and only then get the values?

这当然取决于您的应用程序。如果您很可能从不 需要它们,那么等待可能是有意义的。但是如果你可能需要它们中的任何一个,特别是如果你要多次使用它们,那么,因为那里唯一昂贵的操作是 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)) 操作来获取你可以在 [=25] 中收集的值确实效率低下=] 一个。根据您的数据,这可能永远不是问题,但值得考虑。