анонимная функция javascript как метод объекта - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть небольшая функция для создания объекта и вычисления некоторых свойств

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: я должен делать это? или лучше подождать, пока мне действительно понадобятся max, min и т. д., и только потом получить значения?

1 Ответ

0 голосов
/ 11 сентября 2018

sorted здесь не функция, а результат вызова анонимной функции function (arr) { return arr.sort(function(a, b) { return a - b }) } со значением [...this.array].Так что это не сама функция, которая будет вызываться снова.

PS: я должен делать это?или лучше подождать, пока мне действительно понадобятся max, min и т. д., и только потом получить значения?

Это, конечно, будет зависеть от вашего приложения.Если вы, вероятно, никогда не будете нуждаться в них, возможно, имеет смысл подождать.Но если вам, вероятно, понадобится какой-либо из них, особенно если вы собираетесь использовать их более одного раза, то, поскольку единственной дорогостоящей операцией является 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 только получал max и min, тогда операция O(n * log(n)) неэффективна для получения значений, которые вы можете собрать в O(n).В зависимости от ваших данных, это может никогда не быть проблемой, но стоит подумать.

...