簡體   English   中英

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有一個疑問this.sorted :每次調用它的值都會被計算嗎? 創建對象時,還是只有一次?

PS:我應該這樣做嗎? 還是等到我真正需要maxmin等然后才獲取值才更好?

在此sorted的不是函數,而是調用值為[...this.array]的匿名函數function (arr) { return arr.sort(function(a, b) { return a - b }) }的結果。 因此,它本身並不是將再次被調用的函數。

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 ,那很好。 但是,如果只想獲得maxmin sorted ,那么執行O(n * log(n))操作來獲取可以收集到的O(n)值實際上是低效率的。 根據您的數據,這可能永遠不會成為問題,但是值得考慮。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM