[英]Javascript: removing an event listener attached with an anonymous function to an object's method
[英]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:我應該這樣做嗎? 還是等到我真正需要max
, min
等然后才獲取值才更好?
在此sorted
的不是函數,而是調用值為[...this.array]
的匿名函數function (arr) { return arr.sort(function(a, b) { return a - b }) }
的結果。 因此,它本身並不是將再次被調用的函數。
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
,那很好。 但是,如果只想獲得max
和min
sorted
,那么執行O(n * log(n))
操作來獲取可以收集到的O(n)
值實際上是低效率的。 根據您的數據,這可能永遠不會成為問題,但是值得考慮。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.